首页 > 解决方案 > 使用 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

标签: pythonregex

解决方案


您可以使用

\([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- 一个字。

Python演示

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

推荐阅读