Python正则表达式有条件,如果

2024-10-03 19:29:47 发布

您现在位置:Python中文网/ 问答频道 /正文

对不起,这个标题有点无益,我真的很难解释这个问题

我有一个可以以多种不同方式显示的唯一标识符列表,我正尝试使用正则表达式对它们进行规范化,以便可以跨多个数据库进行比较。以下是一些例子:

AB1201
AB-1201
AB1201-T
AB-12-01L1
AB1201-TER
AB1201 Transit

我已经写了一行代码,提取了所有的hypen和空格,并且使用了这个正则表达式:

([a-zA-Z]{2}[\d]{4})(L\d|Transit|T$)?

这与预期完全一样,返回如下所示的列表:

AB1201
AB1201
AB1201T
AB1201L1
AB1201
AB1201T

问题是,我有一个标识符如下:AB1201-02。我需要将此作为例外情况提出,而不是作为匹配项包括在内

有什么想法吗?如有必要,我很乐意提供更多的澄清。谢谢

From Regex101 online tester


Tags: 代码数据库标题列表ab方式标识符规范化
2条回答

试试这个正则表达式

^([a-zA-Z]{2}[\d]{4})(?!-\d)(L\d|Transit|T|-[A-Z]{3})?$

我添加了(?!...) Negative Lookahead以避免与-02匹配

(?!...) Negative Lookahead: Starting at the current position in the expression, ensures that the given pattern will not match. Does not consume characters.

您可以在this链接上查看演示

您可以使用负前瞻排除匹配以下连字符和数字(?!-\d)

如果它应该从字符串的开头开始,那么可以使用锚点^

注意,您可以将[\d]写为\d

^([a-zA-Z]{2}\d{4})(?!-\d)(L\d|Transit|T$)?

这个图案看起来像

  • ^字符串的开头
  • (捕获第1组
    • [a-zA-Z]{2}\d{4}匹配2次a-zA-Z和4位数字
  • )闭合群
  • (?!-\d)负向前看,断言直接向右的不是-和数字
  • (L\d|Transit|T$)?可选捕获组2

Regex demo

相关问题 更多 >