正则表达式匹配无法 select 带空格的字母数字字符串 python
regex matching is unable to select alphanumeric string with spaces in python
我在 python
中有以下表达式列表
LIST1=["AR BR_18_0138249", "AR R_16_01382649", "BR 16 0138264", "R 16 01382679" ]
在上面的字符串中,一些模式是字母数字,但在第二组序列之间有一个 space。我期待以下输出
"AR BR_18_0138249"
"AR R_16_01382649"
"BR 16 0138264"
"R 16 01382679"
我试过下面的代码
import regex as re
pattern = r"(\bB?R_\w+)(?!.*)|(\bB?R \w+)(?!.*)|(\bR?^sd \w+)(?!.*)"
for i in LIST1:
rest = re.search(pattern, i)
if rest:
print(rest.group(1))
我得到了以下结果
BR_18_0138249
R_16_01382649
None
None
我无法获得带有 space 的序列。我请求有人在这方面指导我
您可以使用
\b(B?R(?=([\s_]))(?:\d+)+)\b(?!.*\b\b)
详情
\b
- 单词边界
(B?R(?=([\s_]))(?:\d+)+)
- 第 1 组:一个可选的 B
,然后是 R
,然后是一个或多个空格或下划线序列,后跟一个或多个数字(如果您需要此处支持字母,将\d+
替换为[^\W_]
)
\b
- 单词边界
(?!.*\b\b)
- 如果有则匹配失败的否定前瞻
.*
- 除换行字符外的任何零个或多个字符,尽可能多
\b\b
- 与第 1 组中相同的值匹配为整个单词(不包含字母、数字或下划线)。
看一个Python re
demo(这里不需要PyPi正则表达式模块):
import re
LIST1=["AR BR_18_0138249", "AR R_16_01382649", "BR 16 0138264", "R 16 01382679" ]
pattern = r"\b(B?R(?=([\s_]))(?:\d+)+)\b(?!.*\b\b)"
for i in LIST1:
rest = re.search(pattern, i)
if rest:
print(rest.group(1))
这样做的工作:
[A-Z]{1,2}\s([A-Z]{1,2}+(?:_[0-9]+)*|[0-9]+(?:\s[0-9]+)*)
此正则表达式给出以下输出:
AR BR_18_0138249
AR R_16_01382649
BR 16 0138264
R 16 01382679
观看演示 here
我在 python
中有以下表达式列表LIST1=["AR BR_18_0138249", "AR R_16_01382649", "BR 16 0138264", "R 16 01382679" ]
在上面的字符串中,一些模式是字母数字,但在第二组序列之间有一个 space。我期待以下输出
"AR BR_18_0138249"
"AR R_16_01382649"
"BR 16 0138264"
"R 16 01382679"
我试过下面的代码
import regex as re
pattern = r"(\bB?R_\w+)(?!.*)|(\bB?R \w+)(?!.*)|(\bR?^sd \w+)(?!.*)"
for i in LIST1:
rest = re.search(pattern, i)
if rest:
print(rest.group(1))
我得到了以下结果
BR_18_0138249
R_16_01382649
None
None
我无法获得带有 space 的序列。我请求有人在这方面指导我
您可以使用
\b(B?R(?=([\s_]))(?:\d+)+)\b(?!.*\b\b)
详情
\b
- 单词边界(B?R(?=([\s_]))(?:\d+)+)
- 第 1 组:一个可选的B
,然后是R
,然后是一个或多个空格或下划线序列,后跟一个或多个数字(如果您需要此处支持字母,将\d+
替换为[^\W_]
)\b
- 单词边界(?!.*\b\b)
- 如果有则匹配失败的否定前瞻.*
- 除换行字符外的任何零个或多个字符,尽可能多\b\b
- 与第 1 组中相同的值匹配为整个单词(不包含字母、数字或下划线)。
看一个Python re
demo(这里不需要PyPi正则表达式模块):
import re
LIST1=["AR BR_18_0138249", "AR R_16_01382649", "BR 16 0138264", "R 16 01382679" ]
pattern = r"\b(B?R(?=([\s_]))(?:\d+)+)\b(?!.*\b\b)"
for i in LIST1:
rest = re.search(pattern, i)
if rest:
print(rest.group(1))
这样做的工作:
[A-Z]{1,2}\s([A-Z]{1,2}+(?:_[0-9]+)*|[0-9]+(?:\s[0-9]+)*)
此正则表达式给出以下输出:
AR BR_18_0138249
AR R_16_01382649
BR 16 0138264
R 16 01382679
观看演示 here