regex Python负先行不起作用,并将值包含在结果中

yks3o0rb  于 2023-08-08  发布在  Python
关注(0)|答案(1)|浏览(94)

我在DataFrame中有一个列,基本上是一个字符串列表。我需要匹配和提取商人的名字在它取决于他们在字符串中。然后,我将根据各种模式搜索返回几个不同的列,最后将它们加在一起,得到一个全面的最终列。我的大多数模式都是有效的,除了一个消极的前瞻。我正在尝试与正面相同的模式,但将(?=x)更改为(?!x)。我也许可以想出更难的方法来做这件事,但我想尽可能保持简单。
由于技术原因,我必须使用Python的re模块。我不能使用regex模块。
我正尝试使用re模块提取商家名称。我使用正向前查找来提取后面跟着 des 的名称,使用'^(\D+\s)(?=des)'。这是完美的工作,并排除以 des 开头。

def merchants(description):
  match = re.search(r'^(\D+\s)(?!des)', description, re.I)
     if match:          
         return match.group().title()    
   return None

字符串
例如:

PLANET FIT DES CLUB FEES 10 2124301022 INDN.  returns   'Planet Fit'
SO CAL GAS DES PAID SCGC 10 1849100202 INDN   returns   'So Cal Gas'


消极展望:但是,当尝试使用^(\D+\s)(?!des)从后面没有 des 的字符串中获取名称或文本时
我得到了以下内容:

CHASE CREDIT CRD DES AUTOPAY 10 0000000002  returns   `Chase Credit Crd Des Autopay`


它在没有des的行上得到了所需的结果,但为什么它包含了des的行?本质上,它包含了与前一个正lookahead相同的字符串,甚至还返回了lookahead值des
我想要2个列表,基本上是相辅相成的,没有交集,所以我可以把它们加在一起。

rqmkfv5c

rqmkfv5c1#

这是因为负先行(?!des)Assert不是直接从 * 当前位置 * 向右的des
你可以做的是从字符串的开头Assert不是单词des,前面是可选的非数字。请注意,如果只需要匹配,可以省略捕获组。
您可以使用字边界\b来防止部分字匹配。
使用\D也匹配\s,所以在这种情况下,它们应该至少是一个空格字符:

^(?!\D*\bdes\b)\D+\s

字符串
Regex demo
或者,如果该行根本不应该包含des

^(?!.*\bdes\b)\D+\s


Regex demo

相关问题