在执行regex模式匹配时,我们得到了已经匹配的内容。如果我想要在内容中找到的模式呢?
见下面的示例:
>>> import re
>>> r = re.compile('ERP|Gap', re.I)
>>> string = 'ERP is integral part of GAP, so erp can never be ignored, ErP!'
>>> r.findall(string)
['ERP', 'GAP', 'erp', 'ErP']
但我希望输出如下所示:['ERP', 'Gap', 'ERP', 'ERP']
因为如果我对原始输出执行组by和sum,我将得到以下输出,作为dataframe:
ERP 1
erp 1
ErP 1
GAP 1
gap 1
但是如果我想让输出看起来像
ERP 3
Gap 2
和我正在搜索的关键词一样吗?
更多上下文
我有一个像这样的关键字列表:['ERP', 'Gap']
。我有一个这样的字符串:"ERP, erp, ErP, GAP, gap"
我想计算每个关键字出现在字符串中的次数。现在,如果我执行模式匹配,我将得到以下输出:[ERP, erp, ErP, GAP, gap]
。
现在,如果我想聚合并进行计数,我将得到以下数据:
ERP 1
erp 1
ErP 1
GAP 1
gap 1
虽然我希望输出如下所示:
ERP 3
Gap 2
发布于 2020-03-10 12:59:00
您可以动态构建模式,以便在组名中包含搜索单词的索引,然后获取匹配的模式部分:
import re
words = ["ERP", "Gap"]
words_dict = { f'g{i}':item for i,item in enumerate(words) }
rx = rf"\b(?:{'|'.join([ rf'(?P<g{i}>{item})' for i,item in enumerate(words) ])})\b"
text = 'ERP is integral part of GAP, so erp can never be ignored, ErP!'
results = []
for match in re.finditer(rx, text, flags=re.IGNORECASE):
results.append( [words_dict.get(key) for key,value in match.groupdict().items() if value][0] )
print(results) # => ['ERP', 'Gap', 'ERP', 'ERP']
模式将类似于\b(?:(?P<g0>ERP)|(?P<g1>Gap))\b
\b
-一个单词边界(?:
-非捕获组封装模式部件的启动:(?P<g0>ERP)
-“g0”组:ERP
|
-或(?P<g1>Gap)
-“g1”组:Gap
)
-小组的末端\b
-一个词的边界。见regex演示。
注[0]
与[words_dict.get(key) for key,value in match.groupdict().items() if value][0]
在所有情况下都可以工作,因为当有匹配时,只有一个组匹配。
发布于 2020-03-10 08:54:10
请参阅上面的评论。尝试:
>>> [x.upper() for x in r.findall(string)]
['ERP', 'GAP', 'ERP', 'ERP']
>>>
或
>>> map(lambda x: x.upper(), r.findall(string))
['ERP', 'GAP', 'ERP', 'ERP']
>>>
https://stackoverflow.com/questions/60614024
复制相似问题