正则表达式模式匹配,不包括案例列表

时间:2016-07-18 18:39:55

标签: python regex

我想匹配街道名称模式,该模式由几个大写字母单词组成,不包括某些情况,但我不知道该怎么做。

模式为“([AZ] [az] + {1,3})”(假设街道名称由1-3个单词组成),短版本阻止列表为[“Apt”,“ West“,”East“表示方向或房间号。

列表中的任何单词(例如“West”)都不应该在匹配结果中。以阻止列表中的那些词开头的词(例如“Westmoreland”)应该在结果中。我怎么写这个正则表达式?

1 个答案:

答案 0 :(得分:0)

您可以使用

\b(?!(?:Apt|West|East)\b)[A-Z][a-z]+(?: (?!(?:Apt|West|East)\b)[A-Z][a-z]+){0,2}

请参阅regex demo

我做了什么:

  • 修正了你的正则表达式实际匹配1到3个单词:[A-Z][a-z]+(?: [A-Z][a-z]+){0,2}
  • 添加了否定前瞻,以限制[A-Z][a-z]+部分匹配的值。

表达式详细信息

  • \b(?!(?:Apt|West|East)\b)[A-Z][a-z]+ - 大写ASCII字母([A-Z]),后跟1 + ASCII小写字母([a-z]但我猜您也可以使用[a-zA-Z]+[a-zA-Z]*这里不是一个完整的单词AptWestEast,它可以通过锚定在\b单词边界的负前瞻来实现。第一个\b是一个前导词边界,然后否定前瞻确保在词边界之后和尾随之前没有AptWestEast \b字边界(确保整个单词匹配)
  • (?: (?!(?:Apt|West|East)\b)[A-Z][a-z]+){0,2} - 0到2次出现:
    • - 空格
    • (?!(?:Apt|West|East)\b)[A-Z][a-z]+ - 见上文。由于AptWestEast只能出现在此处的空格之后,因此您不需要此处的前导字边界,这是一个非单词字符。

很多人会发布更短的解决方案,比如

(?: ?\b(?!(?:Apt|West|East)\b)[A-Z][a-z]+){1,3}

请参阅demo

但是,开头的可选空间也会匹配此前导空格。更重要的是,正则表达式现在不能线性匹配,这会影响性能。使用小字符串,没关系,但仍然是不好的做法。