我在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个列表,基本上是相辅相成的,没有交集,所以我可以把它们加在一起。
1条答案
按热度按时间rqmkfv5c1#
这是因为负先行
(?!des)
Assert不是直接从 * 当前位置 * 向右的des
。你可以做的是从字符串的开头Assert不是单词
des
,前面是可选的非数字。请注意,如果只需要匹配,可以省略捕获组。您可以使用字边界
\b
来防止部分字匹配。使用
\D
也匹配\s
,所以在这种情况下,它们应该至少是一个空格字符:字符串
Regex demo
或者,如果该行根本不应该包含
des
:型
Regex demo的