Python 条件正则表达式:如果是A和B,请选择B
我需要从以下格式的字符串中提取ID:Python 条件正则表达式:如果是A和B,请选择B,python,regex,string,Python,Regex,String,我需要从以下格式的字符串中提取ID:名称ID,其中两者用空格分隔 例如: 有时,ID后面跟着字母A或B(用空格分隔): 在本例中,我希望提取“456 A”,而不是仅提取“456”: 我试图通过以下正则表达式来实现这一点: (\d{1,3}) | (\d{1,3}\s[AB]) 条件运算符|在此设置中不起作用,因为我只获取数字ID。有没有关于如何在此设置中正确设置正则表达式的建议 任何帮助都将不胜感激。您的(\d{1,3})|(\d{1,3}\s[AB])将始终与NFA正则表达式中的第一个分支相
名称ID
,其中两者用空格分隔
例如:
有时,ID后面跟着字母A
或B
(用空格分隔):
在本例中,我希望提取“456 A”,而不是仅提取“456”:
我试图通过以下正则表达式来实现这一点:
(\d{1,3}) | (\d{1,3}\s[AB])
条件运算符|
在此设置中不起作用,因为我只获取数字ID。有没有关于如何在此设置中正确设置正则表达式的建议
任何帮助都将不胜感激。您的(\d{1,3})|(\d{1,3}\s[AB])
将始终与NFA正则表达式中的第一个分支相匹配,如果备选组未锚定在任意一侧,则与“wins”匹配的第一个分支以及右侧的其余分支都不会进行测试
您可以使用可选组:
\d{1,3}(?:\s[AB])?
看
如果所需的值始终位于字符串的末尾,请添加一个
如果可以有多个空格,请在\s
之后添加+
。或者*
如果可以再多出零个空格
请注意,最后一个?
量词是贪婪的,因此如果有空格和a
或B
,它们将是匹配的一部分
见:
您的(\d{1,3})|(\d{1,3}\s[AB])
将始终与NFA正则表达式中的第一个分支相匹配,如果交替组未锚定在任意一侧,则与“wins”匹配的第一个分支以及右侧的其余分支都未进行测试
您可以使用可选组:
\d{1,3}(?:\s[AB])?
看
如果所需的值始终位于字符串的末尾,请添加一个
如果可以有多个空格,请在\s
之后添加+
。或者*
如果可以再多出零个空格
请注意,最后一个?
量词是贪婪的,因此如果有空格和a
或B
,它们将是匹配的一部分
见:
如果你有一个可选的部分,你可能想包括,但不一定需要,你可以只使用一个“最多一次”量词:
Riverside (\d{1,3}(?: [AB])?)
?:
将组标记为“未捕获”,因此不会返回这些组。而?
告诉它要么匹配一次,要么忽略它。如果您有一个可选的部分,您可能想包括,但不一定需要,您可以使用“最多一次”量词:
Riverside (\d{1,3}(?: [AB])?)
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'
?:
将组标记为“未捕获”,因此不会返回这些组。而?
告诉它要么匹配一次,要么忽略它。您可以使用交替
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'
p = re.compile('''(\d{1,3}\s[AB]|\d{1,3})$''')
注意:末尾(组外)的
$
或\s
很重要,否则它会将123 C
和1234
捕获为123
,而不是不匹配。您可以使用交替
p = re.compile('''(\d{1,3}\s[AB]|\d{1,3})$''')
注意:结尾处(组外)的
$
或\s
很重要,否则它会将123 C
和1234
捕获为123
,而不是不匹配。尝试颠倒语句顺序,先获取更具体的语句。即:
(\d{1,3}\s[AB]) | (\d{1,3})
试着颠倒语句的顺序,首先使用更具体的语句。即:
(\d{1,3}\s[AB]) | (\d{1,3})
这是整行吗,如果是的话,你能做一个子串吗?你不能做一个零或一个检查吗(?)看起来空白是0或1,也是0或1,
(\d{1,3}[\AB]*)
这是整行吗,如果是的话,你能做一个子串吗?你不能做一个零或一个检查吗(?)看起来空白是0或1,也是0或1,(\d{1,3}[\AB]*)“
我认为它需要捕获,从本例的问题中,我想提取‘456 A’。事实上,我认为,Riverside
不能硬编码,OP需要从任意字符串中提取ID。嗯……没有更多信息,这和我的假设一样有效。”不带任何前缀的正则表达式可以匹配除OP实际想要的内容之外的所有内容。毕竟,这只是一个可能的解决方案。从这里开始,用\w+
替换Riverside
非常简单。@PyNEwbie如果仔细观察,您会发现它正在捕获,因为第一组包括非捕获组。我几乎只是确保结果匹配与OP当前的匹配相似,以避免混淆。:)我认为它需要捕获,从本例中的问题中,我想提取“456 A”。事实上,我相信Riverside
不能硬编码,OP需要从任意字符串中提取ID。嗯……如果没有更多信息,这和我的假设一样有效不带任何前缀的正则表达式可以匹配除OP实际想要的内容之外的所有内容。毕竟,这只是一个可能的解决方案。从这里开始,用\w+
替换Riverside
非常简单。@PyNEwbie如果仔细观察,您会发现它正在捕获,因为第一组包括非捕获组。我几乎只是确保结果匹配与OP当前的匹配相似,以避免混淆。:)像这样的交替总是会使可选组的性能下降。正如我所说的:这个解决方案在正则表达式性能方面不是最优的,因为回溯必须努力检查两个分支中的1到3位数字。对于初学者来说,这是一个可读的解决方案,但在生产中这绝对是一个糟糕的做法。像这样的交替总是会使可选组的性能下降。正如我所说的:这种解决方案在正则表达式性能方面不是最佳的,因为回溯必须努力检查两个分支中的1到3位数字。对于初学者来说,这是一个可读的解决方案,但在生产中这绝对是一个糟糕的做法。@chizze请检查答案,并告知它是否有效