python - 使用 RE 查找所有模式
问题描述
我有这个字符串:
"(a) first, (b) second, (c) important"
我试图找到“(c)重要”字符串之前的所有字符串,所以这是我的正则表达式:
"(?:\([a-z]\) ([a-z]+), )+\([a-z]\) important"
re.findall
仅查找“第二个”字符串(没有“第一个”字符串)。
我尝试使用re.finditer
和正则表达式模块(带有重叠标志),但它们都返回相同的结果。
这里应该怎么做才能找到“重要”字符串之前的所有字符串?
注意 -
输入字符串可以不同。例如:
"(a) aa, (b) cc, (c) dd, (d) oi, (e) important" # should return ["aa", "cc", "dd", "oi"]
"(a) aa, (b) asdf, (c) wer" # should return nothing
解决方案
您可以使用
\([a-z]\)\s+([a-z]+)(?=(?:\s*,\s*\([a-z]\)\s+[a-z]+)*\s*,\s*\([a-z]\)\s+important)
查看正则表达式演示
细节
\([a-z]\)
- 括号内的小写字母\s+
- 1+ 空格([a-z]+)
- 第 1 组:括号内的一个或多个小写字母(?=(?:\s*,\s*\([a-z]\)\s+[a-z]+)*\s*,\s*\([a-z]\)\s+important)
- 与紧随其后的位置匹配的正向前瞻(?:\s*,\s*\([a-z]\)\s+[a-z]+)*
- 0次或多次重复\s*,\s*
- 用 0+ 个空格括起来的逗号\([a-z]\)
- 括号中的字母\s+
- 1+ 空格[a-z]+
- 1+ 小写字母
\s*,\s*
- 用 0+ 个空格括起来的逗号\([a-z]\)
- 括号内的小写字母\s+
- 1+ 空格important
- 一个字。
import re
strs = ["(a) first, (b) second, (c) important", "(a) aa, (b) cc, (c) dd, (d) oi, (e) important", "(a) aa, (b) asdf, (c) wer" ]
r = re.compile(r'\([a-z]\)\s+([a-z]+)(?=(?:\s*,\s*\([a-z]\)\s+[a-z]+)*\s*,\s*\([a-z]\)\s+important)')
for s in strs:
print(r.findall(s))
输出:
['first', 'second']
['aa', 'cc', 'dd', 'oi']
[]
推荐阅读
- hover - 悬停时出现在光标旁边的文字
- c# - 范围选择和/或在 C# 上的 Excel 的 VSTO 插件中使用 InputBox 导致错误和构建失败
- google-apps-script - 谷歌应用程序电子表格应用程序中是否有将活动电子表格保存为另一个名称(复制)的功能?
- javascript - 如何对图像的一部分进行缩放效果?
- hl7-fhir - FHIR - 包含的资源和参考
- php - Wordpress 所有链接都送我回家
- swift - 防止在 CoreData 中使用生成的初始化程序
- python - 通过模块的功能传递敏感数据是否存在安全问题?
- r - 如何找到 RMSE 值?什么是好的 RMSE 值?
- git - 如何排除“Merge pull request #17 from me/my-branch”类型的提交消息?