猿问

在不区分大小写的搜索期间提取与模式中使用的原始大小写的匹配项

在执行正则表达式模式匹配时,我们得到的是匹配的内容。如果我想要在内容中找到的模式怎么办?


请参阅以下示例:


>>> 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']


因为如果我对原始输出进行分组和求和,我会得到以下输出作为数据帧:


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


ITMISS
浏览 122回答 2
2回答

UYOU

您可以动态构建模式,以在组名称中包含您搜索的单词的索引,然后获取与以下各项匹配的模式部分:import rewords = ["ERP", "Gap"]words_dict = { f'g{i}':item for i,item in enumerate(words) }&nbsp;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):&nbsp; &nbsp; results.append( [words_dict.get(key) for key,value in match.groupdict().items() if value][0] )print(results) # => ['ERP', 'Gap', 'ERP', 'ERP']在线观看&nbsp;Python 演示该模式将如下所示:\b(?:(?P<g0>ERP)|(?P<g1>Gap))\b\b- 一个单词边界(?:- 非捕获组封装图案部件的开始:(?P<g0>ERP)- 组“g0”:ERP|- 或(?P<g1>Gap)- 组“g1”:Gap)- 组的结束\b- 一个单词边界。请参阅正则表达式演示。注意 with 将适用于所有情况,因为当有匹配项时,只有一个组匹配。[0][words_dict.get(key) for key,value in match.groupdict().items() if value][0]

海绵宝宝撒

请参阅上面的评论。尝试:>>>&nbsp;[x.upper()&nbsp;for&nbsp;x&nbsp;in&nbsp;r.findall(string)] ['ERP',&nbsp;'GAP',&nbsp;'ERP',&nbsp;'ERP'] >>>或>>>&nbsp;map(lambda&nbsp;x:&nbsp;x.upper(),&nbsp;r.findall(string)) ['ERP',&nbsp;'GAP',&nbsp;'ERP',&nbsp;'ERP']>>>
随时随地看视频慕课网APP

相关分类

Python
我要回答