首页 > 解决方案 > 正则表达式匹配无法在 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

我无法获得带有空格的序列。我请求有人在这方面指导我

标签: pythonregexmatchalphanumeric

解决方案


您可以使用

\b(B?R(?=([\s_]))(?:\2\d+)+)\b(?!.*\b\1\b)

查看正则表达式演示

细节

  • \b- 单词边界
  • (B?R(?=([\s_]))(?:\2\d+)+)- 第 1 组:可选B, then R, 然后是一个或多个空格或下划线序列,后跟一个或多个数字(如果您需要在此处支持字母,请替换\d+[^\W_]
  • \b- 单词边界
  • (?!.*\b\1\b)- 如果存在匹配失败的负前瞻
    • .*- 除换行符以外的任何零个或多个字符,尽可能多
    • \b\1\b- 与第 1 组中的相同值匹配为整个单词(不包含字母、数字或下划线)。

查看Pythonre演示(此处不需要 PyPi 正则表达式模块):

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))

推荐阅读