我需要从以下格式的字符串中提取ID:Name ID
,其中两个用空格分隔。
示例:
'Riverside 456'
有时,ID后跟字母A
或B
(以空格分隔):
'Riverside 456 A'
在这种情况下,我想提取' A'而不只是'''' 我尝试使用以下正则表达式完成此任务:
(\d{1,3}) | (\d{1,3}\s[AB])
条件运算符|
在此设置中不能正常工作,因为我只获取数字ID。有关如何在此设置中正确设置正则表达式的任何建议吗?
任何帮助都将不胜感激。
答案 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])?
如果您需要的值始终位于字符串的末尾,请添加$
at the end。
如果可以有超过1个空格,请在+
之后添加\s
。或*
如果可能有零个空格。
请注意,最后一个?
量词是贪婪的,所以如果有一个空格A
或B
,它们将成为匹配的一部分。
请参阅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 C
和1234
123
而不是匹配。