如何从正则表达式中排除两个单词?

2024-09-30 22:11:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个正则表达式:

\]\s*(AN|AV)\s*1\s*([\w\s]+)\s*2\s*([\w\s]+)\s*3\s*([\w\s][^cui]+)

这应该匹配

] AN 1 words 2 words 3 words

] AV 1 words 2 words 3 words

3后面的单词应该排除“dacui”,所以"da\scui",但它不起作用。在这里试试:https://regex101.com/r/kI7Tan/1

我做错了什么

示例字符串:

campo]  AN  1 campo   2 prato  con penna B sps a  1   3 da cui campo con penna C as a  1  cfr Nota  filologica 

预期输出:由于“da cui”的原因,它将不匹配。因此,基本上我想匹配所有单词,而不需要字符串“dacui”


Tags: 字符串httpscoman单词condawords
3条回答

您可以使用以下两种方法之一:

\]\s*(AN|AV)\s*1\s*([\w\s]+?)\s*2\s*([\w\s]+?)\s*3\s*((?:(?!cui).)*)
\]\s*(AN|AV)\s*1\s*([\w\s]+?)\s*2\s*([\w\s]+?)\s*3\s*(.*?)(?=cui|$)

regex demo

(?:(?!cui).)*是一个tempered greedy token匹配任何字符、0次或多次出现(尽可能多)的字符序列,它不启动cui字符序列。(.*?)(?=cui|$)模式捕获0+个字符(换行字符除外),尽可能少,直到cui字符序列或字符串结尾

正则表达式(([\w\s][^cui]+))的最终捕获组与

  • 由于第一个字符类,因此正好是1个单词字符。 由于正则表达式中前面的\s*,此类与空白不匹配
  • cui以外的任意数量的字符

如果要排除取决于单词da cui的匹配项,请使用负前瞻

\]\s*(AN|AV)\s*1\s*([\w\s]+)\s*2\s*([\w\s]+)\s*3\s*(?!.*da cui)(.*)

demo (regex101)

更新

捕获组重新引入正则表达式

我对这个问题的解释是,如果字符串3后面的一个或多个空格(到行尾),那么如果该字符串中存在一个空字符串,则将该字符串保存到捕获组4,否则该字符串将保存到捕获组4

您可以使用以下正则表达式

\]\s*(AN|AV)\s+1\s+([\w\s]+)\s+2\s+([\w\s]+)\s+3\s+((?=.*\bda cui\b)|(?!=.*\bda cui\b).*)

Demo

这将OP的正则表达式中的3\s*([\w\s][^cui]+)替换为3\s+((?=.*\bda cui\b)|(?!=.*\bda cui\b).*)

Python的正则表达式引擎在匹配3之后执行以下步骤

\s+                  match 1+ spaces
(                    begin capture group 4
  (?=.*\bda cui\b)   match 0+ chars, then 'da cui' in a positive lookahead 
  |                  or
  (?!=.*\bda cui\b)  match 0* chars, then 'da cui' in a negative lookahead
  .*                 match rest of line
)                    end capture group 4

如果正向前瞻成功,则会将空字符串保存到捕获组

相关问题 更多 >