问题描述
我在python中有以下表达式列表
LIST1=["AR BR_18_0138249","AR R_16_01382649","BR 16 0138264","R 16 01382679" ]
在上面的字符串中,一些模式是字母数字,但是第二组序列之间有一个空格。我期望以下输出
"AR BR_18_0138249"
"AR R_16_01382649"
"BR 16 0138264"
"R 16 01382679"
我尝试了以下代码
import regex as re
pattern = r"(\bB?R_\w+)(?!.*\1)|(\bB?R \w+)(?!.*\1)|(\bR?^sd \w+)(?!.*\1)"
for i in LIST1:
rest = re.search(pattern,i)
if rest:
print(rest.group(1))
我获得了以下结果
BR_18_0138249
R_16_01382649
None
None
我无法获得带有空格的序列。我要求有人在这方面指导我
解决方法
您可以使用
\b(B?R(?=([\s_]))(?:\2\d+)+)\b(?!.*\b\1\b)
请参见regex demo
详细信息
-
\b
-单词边界 -
(B?R(?=([\s_]))(?:\2\d+)+)
-第1组:可选的B
,然后是R
,然后是空格或下划线的一个或多个序列,后跟一个或多个数字(如果需要支持字母,则为在这里,将\d+
替换为[^\W_]
) -
\b
-单词边界 -
(?!.*\b\1\b)
-负前瞻,如果存在,则匹配失败-
.*
-尽可能多的零个或多个除换行符以外的字符 -
\b\1\b
-与第1组中的值相同,作为一个整体匹配(不包含字母,数字或下划线)。
-
请参阅Python re
demo(此处不需要PyPi regex模块):
import re
LIST1=["AR BR_18_0138249","AR R_16_01382649","BR 16 0138264","R 16 01382679" ]
pattern = r"\b(B?R(?=([\s_]))(?:\2\d+)+)\b(?!.*\b\1\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