1

我希望正则表达式a|b|c重复多次,用空格分隔,但正则表达式不应该接受尾空格:

 "a b c c b"  - ok
 "a b c c b " - not ok

所以我有"(a|b|c)( (a|b|c))+""((a|b|c) )+" 但我的正则表达式有超过 3 个单词,所以模式很长且不可读。

"^((?:word1|word2|word3|word4|...)(?: (?:word1|word2|word3|word4|...))+)$"

我只想询问简短版本,对最后一个空间使用前瞻/lookbehining 机制或类似于仅匹配内部空间的某事。如何改变((a|b|c) )+来实现?

4

2 回答 2

1

如果这些都是字母数字单词,那么您可以使用单词边界锚点

^(?:(?:word1|word2|word3|word4|...)\b\s*)+\b$

解释:

^      # Start of string
(?:    # Start of non-capturing group, first matching...
 (?:word1|word2|word3|word4|...) # ...one of these words,
 \b    # then matching the end of a word,
 \s*   # then matching zero or more whitespace
)+     # one or more times.
\b     # At the end, make sure that the end of the last word...
$      # ...is at the end of the string.

第一个\b确保单词之间\s*必须匹配至少一个空白字符。

于 2013-07-22T11:19:43.463 回答
0

您在模式中有 2 个相似的地方(?:word1|word2|word3|word4|...)。第二个从空间开始。您可以通过(?:word1|word2|word3|word4|...)以空格或^. 这将避免重复。

>>> compiled = re.compile(r'(?:(?:\s|^)(?:a|b|c))+$')
>>> compiled.match('a b c c b').group(0)
'a b c c b'
>>> compiled.match('a b c c b ')
None
>>> compiled.match('a').group(0)
'a'
>>> compiled.match('a ')
None
于 2013-07-22T11:16:44.653 回答