python - 如何重新检查正则表达式中的匹配表达式?
问题描述
我试图在给定文本中捕捉一个基数后面跟着一个点的单词。例如,对于引号中的表达式:
“1.文字”
应该返回“ text ”。“文本”可以是纯字母或其他数字。
我想出了以下正则表达式,它完全实现了这一点:
r'(?:(?:(?<=\s)|(?<!.))\d+\.\s)([^\s.,:!?]*)'
问题是如果“文本”与非捕获词属于同一类型,则不会再次对其进行检查。例子:
“2. wordX wordY.”:返回“wordX”,预期行为
“3. 4. wordZ.”:返回“4”,这是预期的行为。
我也希望得到“wordZ”,因为它与表达式“4.wordZ.”匹配,但它没有被捕获。
如何在匹配的表达式重叠的地方获得两者?
解决方案
您可以匹配第一个数字点和空格模式,然后开始一个捕获组。
在该捕获组中,您可以选择重复相同的模式,然后是字符类。
然后对于每个匹配在点和空格上拆分。
(?<!\S)
断言空白边界\d+\.\s
匹配数字点和空白字符(
捕获组 1(?:\d+\.\s)*
匹配数字点和空白字符的可选重复[^\s.,:!?]+
匹配字符类中列出的内容的 1 倍以上
)
关闭组 1
import re
pattern = r"(?<!\S)\d+\.\s((?:\d+\.\s)*[^\s.,:!?]+)"
strings = [
"1. text",
"2. wordX wordY.",
"3. 4. wordZ."
]
for s in strings:
for m in re.finditer(pattern, s):
print(m.group(1).split(". "))
输出
['text']
['wordX']
['4', 'wordZ']
另一种方法是使用PyPi 正则表达式模块,在后视中使用无限量词来查找左侧的数字点和空格。
这是与上面相同的模式结构,现在只有匹配项在后视中,组值现在是匹配项。
(?<=(?<!\S)\d+\.\s(?:\s\d+\.\s)*)[^\s.,:!?]+
import regex
pattern = r"(?<=(?<!\S)\d+\.\s(?:\s\d+\.\s)*)[^\s.,:!?]+"
strings = [
"1. text",
"2. wordX wordY.",
"3. 4. wordZ."
]
for s in strings:
print(regex.findall(pattern, s))
输出
['text']
['wordX']
['4', 'wordZ']
推荐阅读
- rust - 初始化函数在 `lazy_static` 块中被调用两次
- python - ncks:错误收到 3 个文件名;不超过两个
- javascript - 如何将不同的处理程序分配给一个事件侦听器,例如单击 addEventListener。这就是我正在做的事情
- google-sheets - 是否有条件格式查找文本和日期条件
- oauth-2.0 - 使用 Postman 使用 CUSTOM_AUTH 从 Cognito 获取身份验证令牌
- c# - 哪种设计模式适合使用?
- html - 简单的 CSS 网格问题:Col 不占全角
- reactjs - 如何从 React 中的组件返回值
- php - PHP 内容未在 docker 容器中解析
- java - Google Guice + Mockito