Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 条件正则表达式:如果是A和B,请选择B_Python_Regex_String - Fatal编程技术网

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

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
,其中两者用空格分隔

例如:

有时,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请检查答案,并告知它是否有效