【问题标题】:regex make group appear only once正则表达式使组只出现一次
【发布时间】:2020-09-16 09:33:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • (((elle).{0,10}(dit).{0,10}) | (.{0,10}(dit).{0,10}(elle))) ?
  • 感谢您的回答。我有一个列表中的主题和动词列表。最终,我想使用 (?P) 和 (?P) 存储在给定句子中找到的主语和动词,你的答案是否适用?
  • ?P 代表什么?
  • 表示这是一个命名的捕获组,名称在符号内。有关示例,请参见下面的 Wiktor 回答。

标签: python regex text french


【解决方案1】:

您可以使用可以使用pip install regex(或pip3 install regex)安装的PyPi 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)?'

详情

  • (?&lt;=\b(?P&lt;subject&gt;il|elle)\b.{0,10})? - 一个可选的回溯以抓取整个单词 ilelle 在 0 到 10 个字符内
  • \b(?P&lt;predicate&gt;dit|mange)\b - 一个完整的词 ditmange
  • (?=.{0,10}\b(?P&lt;subject&gt;il|elle)\b)? - 一个可选的期待在谓词的 0 到 10 个字符内抓取整个单词 ilelle

【讨论】:

  • 谢谢,这很好。我已经尝试使用您的 pyhton 演示链接。假设查询只返回动词(即主语不同于“il”或“elle”),那么它将返回主语的“无”,我必须避免这种情况。我发现我可以删除字典中主题为“无”的所有条目,然后。
猜你喜欢
  • 2013-09-29
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
相关资源
最近更新 更多