正则表达式匹配无法在python中选择带空格的字母数字字符串

问题描述

我在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