正则表达式使组只出现一次

regex make group appear only once

我正在尝试 运行 Python 上的正则表达式查询,但遇到以下问题:

在法语中,句子的主语可以出现在动词前后。 例如,句子“she says”可以翻译成“elle dit”和“dit-elle”,其中“elle”是“she”,“dit”是“says”。

是否可以仅捕获包含“elle”和“dit”的句子,无论主语“elle”是在动词“dit”之前还是之后?我从以下开始:

(elle).{0;10}(dit).{0;10}(elle)

但现在我想在 (elle) 找到另一个时将其中一个设为可选。 *+ 运算符在这种情况下没有帮助。

您可以使用 PyPi regex 模块,可以使用 pip install regex(或 pip3 install regex)安装:

import regex
p = r'(?<=\b(?P<subject>il|elle)\b.{0,10})?\b(?P<predicate>dit|mange)\b(?=.{0,10}\b(?P<subject>il|elle)\b)?'
print( [x.groupdict() for x in regex.finditer(p, 'elle dit et dit-elle et il mange ... dit-il', regex.S)])

online Python demo

模式可以从变量动态创建:

subjects = ['il', 'elle']
predicates = ['dit', 'mange']
p = fr'(?<=\b(?P<subject>{"|".join(subjects)})\b.{0,10})?\b(?P<predicate>{"|".join(predicates)})\b(?=.{0,10}\b(?P<subject>{"|".join(subjects)})\b)?'

详情

  • (?<=\b(?P<subject>il|elle)\b.{0,10})? - 一个可选的回顾以从
  • 的 0 到 10 个字符内抓取整个单词 ilelle
  • \b(?P<predicate>dit|mange)\b - 一个完整的单词 ditmange
  • (?=.{0,10}\b(?P<subject>il|elle)\b)? - 可选期待从谓词中获取 0 到 10 个字符内的整个单词 ilelle