RegEx用于将字符串与空格和单词匹配

时间:2019-07-16 00:22:51

标签: python regex regex-lookarounds regex-group

我有以下字符串:

  

棕色狐狸abc(1)(x)

使用以下正则表达式:

(?i)(\s{1})(abc\(1\)\([x|y]\))

,输出为

  

abc(1)(x)

这是预期的,但是,我似乎无法做到:

  1. 使用\ W \ w \ d \ D等提取1个以上的空间
  2. 组合量词以添加更多空间。

我想要以下输出:

  

棕色狐狸abc(1)(x)

从主查询“ abc(1)(x)”开始,我希望在查询的任一侧最多输入5个字。我的假设是空格会划定一个单词。

编辑1:

在将来的示例中,两侧的5个字都是未知的。该字符串可能是:

  

戴着黑帽子的猫是abc(1)(x),棕色狐狸越过   懒狗。

在这种情况下,所需的输出将是:

  

戴黑帽子的人是abc(1)(x),棕色狐狸跳得很快

编辑2:

在第一个示例中编辑了预期的输出,并添加了“最多” 5个字

2 个答案:

答案 0 :(得分:2)

(?:[0-9A-Za-z_]+[^0-9A-Za-z_]+){0,5}abc\(1\)\([xy]\)(?:[^0-9A-Za-z_]+[0-9A-Za-z_]+){0,5}

请注意,我已将\w+更改为[0-9A-Za-z_]+,将\W+更改为[^0-9A-Za-z_]+,因为取决于您的语言环境/ Unicode设置\W和{{1} }可能无法按照您期望的方式运行。

还请注意,我并不是专门寻找空格,只是“非单词字符”可能会更好地处理引号字符等边缘情况。 但是无论如何,这都能带给您大部分帮助。

顺便说一句:您称此为“环视”-确实与正则表达式功能的“正则表达式环视”无关。

答案 1 :(得分:1)

如果我正确理解了您的要求,那么您想要执行以下操作:

(?:\w+[ ]){0,5}(abc\(1\)\([xy]\))(?:[ ]\w+){0,5}

Demo

崩溃:

(?:               # Start of a non-capturing group.
    \w+           # Any word character repeated one or more times (basically, a word).
    [ ]           # Matches a space character literally.
)                 # End of the non-capturing group.
{0,5}             # Match the previous group between 0 and 5 times.
(                 # Start of the first capturing group.
    abc\(1\)      # Matches "abc(1)" literally.
    \([xy]\)      # Matches "(x)" or "(y)". You don't need "|" inside a character class.
)                 # End of the capturing group.
(?:[ ]\w+){0,5}   # Same as the non-capturing group above but the space is before the word.

注释:

  • 要使模式不区分大小写,您可以在进行操作时以(?i)开头,也可以使用re.IGNORECASE flag
  • 如果要支持不以空格分隔的单词,则可以用[ ](表示非单词字符)或包含所有标点符号的字符类替换\W+您想要支持(例如[.,;?! ])。