我有以下字符串:
棕色狐狸abc(1)(x)
使用以下正则表达式:
(?i)(\s{1})(abc\(1\)\([x|y]\))
,输出为
abc(1)(x)
这是预期的,但是,我似乎无法做到:
我想要以下输出:
棕色狐狸abc(1)(x)
从主查询“ abc(1)(x)”开始,我希望在查询的任一侧最多输入5个字。我的假设是空格会划定一个单词。
编辑1:
在将来的示例中,两侧的5个字都是未知的。该字符串可能是:
戴着黑帽子的猫是abc(1)(x),棕色狐狸越过 懒狗。
在这种情况下,所需的输出将是:
戴黑帽子的人是abc(1)(x),棕色狐狸跳得很快
编辑2:
在第一个示例中编辑了预期的输出,并添加了“最多” 5个字
答案 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+
您想要支持(例如[.,;?! ]
)。