首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在不区分大小写的搜索过程中,提取与模式中使用的原始大小写的匹配。

在不区分大小写的搜索过程中,提取与模式中使用的原始大小写的匹配。
EN

Stack Overflow用户
提问于 2020-03-10 08:41:23
回答 2查看 214关注 0票数 1

在执行regex模式匹配时,我们得到了已经匹配的内容。如果我想要在内容中找到的模式呢?

见下面的示例:

代码语言:javascript
运行
复制
>>> 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:

代码语言:javascript
运行
复制
ERP 1
erp 1
ErP 1
GAP 1
gap 1

但是如果我想让输出看起来像

代码语言:javascript
运行
复制
ERP 3
Gap 2

和我正在搜索的关键词一样吗?

更多上下文

我有一个像这样的关键字列表:['ERP', 'Gap']。我有一个这样的字符串:"ERP, erp, ErP, GAP, gap"

我想计算每个关键字出现在字符串中的次数。现在,如果我执行模式匹配,我将得到以下输出:[ERP, erp, ErP, GAP, gap]

现在,如果我想聚合并进行计数,我将得到以下数据:

代码语言:javascript
运行
复制
ERP 1
erp 1
ErP 1
GAP 1
gap 1

虽然我希望输出如下所示:

代码语言:javascript
运行
复制
ERP 3
Gap 2
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-10 12:59:00

您可以动态构建模式,以便在组名中包含搜索单词的索引,然后获取匹配的模式部分:

代码语言:javascript
运行
复制
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']

Python在线演示

模式将类似于\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]在所有情况下都可以工作,因为当有匹配时,只有一个组匹配。

票数 4
EN

Stack Overflow用户

发布于 2020-03-10 08:54:10

请参阅上面的评论。尝试:

代码语言:javascript
运行
复制
>>> [x.upper() for x in r.findall(string)]
['ERP', 'GAP', 'ERP', 'ERP']
>>>

代码语言:javascript
运行
复制
>>> map(lambda x: x.upper(), r.findall(string))
['ERP', 'GAP', 'ERP', 'ERP']
>>> 
票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60614024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档