条件正则表达式:如果A和B,则选择B.

时间:2016-07-12 16:10:42

标签: python regex string

我需要从以下格式的字符串中提取ID:Name ID,其中两个用空格分隔。

示例

'Riverside 456'

有时,ID后跟字母AB(以空格分隔):

'Riverside 456 A'

在这种情况下,我想提取' A'而不只是'''' 我尝试使用以下正则表达式完成此任务:

(\d{1,3}) | (\d{1,3}\s[AB])

条件运算符|在此设置中不能正常工作,因为我只获取数字ID。有关如何在此设置中正确设置正则表达式的任何建议吗?

任何帮助都将不胜感激。

5 个答案:

答案 0 :(得分:3)

尝试颠倒语句的顺序,先使用更具体的语句。即:

     (\d{1,3}\s[AB]) | (\d{1,3})

答案 1 :(得分:2)

您的(\d{1,3})|(\d{1,3}\s[AB])将始终与NFA正则表达式中的第一个分支匹配,如果替换组未锚定在任何一侧,则第一个分支匹配"胜出",其余部分右侧的分支未经过测试。

您可以使用可选组:

\d{1,3}(?:\s[AB])?

请参阅the regex demo

如果您需要的值始终位于字符串的末尾,请添加$ at the end

如果可以有超过1个空格,请在+之后添加\s。或*如果可能有零个空格。

请注意,最后一个?量词是贪婪的,所以如果有一个空格AB,它们将成为匹配的一部分。

请参阅Python demo

import re
rx = r'\d{1,3}(?:\s[AB])?'
s = ['Riverside 456 A', 'Riverside 456']
print([re.search(rx, x).group() for x in s])

答案 2 :(得分:2)

如果你有一个可选的部分,你可能想要包括,但不一定需要,你可以只使用一次"最多一次"量词:

Riverside (\d{1,3}(?: [AB])?)

?:将群组标记为" not-captured",因此他们不会被退回。并且?告诉它要么匹配一次要么忽略它。

答案 3 :(得分:0)

import re

pattern = re.compile(r'(\d{1,3}\s?[AB]?)$')
print(pattern.search('Riverside 456').group(0))    # => '456'
print(pattern.search('Riverside 456 A').group(0))  # => '456 A'

答案 4 :(得分:0)

您可以使用替换

p = re.compile('''(\d{1,3}\s[AB]|\d{1,3})$''')

NB $或者\s最后(组外)很重要,否则它会同时捕获123 C1234 123而不是匹配。