Python:UserWarning:此模式具有匹配组.要实际获取组,请使用str.extract

Pet*_*rov 12 python regex pandas

我有一个数据帧,我尝试获取字符串,其中列包含一些字符串Df看起来像

member_id,event_path,event_time,event_duration
30595,"2016-03-30 12:27:33",yandex.ru/,1
30595,"2016-03-30 12:31:42",yandex.ru/,0
30595,"2016-03-30 12:31:43",yandex.ru/search/?lr=10738&msid=22901.25826.1459330364.89548&text=%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D1%8B+%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD&suggest_reqid=168542624144922467267026838391360&csg=3381%2C3938%2C2%2C3%2C1%2C0%2C0,0
30595,"2016-03-30 12:31:44",yandex.ru/search/?lr=10738&msid=22901.25826.1459330364.89548&text=%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D1%8B+%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD&suggest_reqid=168542624144922467267026838391360&csg=3381%2C3938%2C2%2C3%2C1%2C0%2C0,0
30595,"2016-03-30 12:31:45",yandex.ru/search/?lr=10738&msid=22901.25826.1459330364.89548&text=%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D1%8B+%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD&suggest_reqid=168542624144922467267026838391360&csg=3381%2C3938%2C2%2C3%2C1%2C0%2C0,0
30595,"2016-03-30 12:31:46",yandex.ru/search/?lr=10738&msid=22901.25826.1459330364.89548&text=%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D1%8B+%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD&suggest_reqid=168542624144922467267026838391360&csg=3381%2C3938%2C2%2C3%2C1%2C0%2C0,0
30595,"2016-03-30 12:31:49",kinogo.co/,1
30595,"2016-03-30 12:32:11",kinogo.co/melodramy/,0
Run Code Online (Sandbox Code Playgroud)

和另一个df与网址

url
003\.ru\/[a-zA-Z0-9-_%$#?.:+=|()]+\/mobilnyj_telefon_bq_phoenix
003\.ru\/[a-zA-Z0-9-_%$#?.:+=|()]+\/mobilnyj_telefon_fly_
003\.ru\/sonyxperia
003\.ru\/[a-zA-Z0-9-_%$#?.:+=|()]+\/mobilnye_telefony_smartfony
003\.ru\/[a-zA-Z0-9-_%$#?.:+=|()]+\/mobilnye_telefony_smartfony\/brands5D5Bbr_23
1click\.ru\/sonyxperia
1click\.ru\/[a-zA-Z0-9-_%$#?.:+=|()]+\/chasy-motorola
Run Code Online (Sandbox Code Playgroud)

我用

urls = pd.read_csv('relevant_url1.csv', error_bad_lines=False)
substr = urls.url.values.tolist()
data = pd.read_csv('data_nts2.csv', error_bad_lines=False, chunksize=50000)
result = pd.DataFrame()
for i, df in enumerate(data):
    res = df[df['event_time'].str.contains('|'.join(substr), regex=True)]
Run Code Online (Sandbox Code Playgroud)

但它回报了我

UserWarning: This pattern has match groups. To actually get the groups, use str.extract.
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

cli*_*rad 28

摆脱警告的另一种方法是更改​​正则表达式,使其成为匹配组而不是捕获组。这就是(?:)符号。

因此,如果匹配组是(url1|url2),则应替换为(?:url1|url2)

  • 最佳答案我认为。 (7认同)

unu*_*tbu 14

至少有一个正则表达式模式urls必须使用捕获组. str.contains仅对每行返回True或False df['event_time']- 它不使用捕获组.因此,UserWarning警告您正则表达式使用捕获组但未使用匹配.

如果您想删除,UserWarning您可以从正则表达式模式中找到并删除捕获组.它们没有显示在您发布的正则表达式模式中,但它们必须存在于您的实际文件中.在字符类之外查找括号.

或者,您可以通过放置来抑制此特定的UserWarning

import warnings
warnings.filterwarnings("ignore", 'This pattern has match groups')
Run Code Online (Sandbox Code Playgroud)

在致电之前str.contains.


这是一个演示问题(和解决方案)的简单示例:

# import warnings
# warnings.filterwarnings("ignore", 'This pattern has match groups') # uncomment to suppress the UserWarning

import pandas as pd

df = pd.DataFrame({ 'event_time': ['gouda', 'stilton', 'gruyere']})

urls = pd.DataFrame({'url': ['g(.*)']})   # With a capturing group, there is a UserWarning
# urls = pd.DataFrame({'url': ['g.*']})   # Without a capturing group, there is no UserWarning. Uncommenting this line avoids the UserWarning.

substr = urls.url.values.tolist()
df[df['event_time'].str.contains('|'.join(substr), regex=True)]
Run Code Online (Sandbox Code Playgroud)

版画

  script.py:10: UserWarning: This pattern has match groups. To actually get the groups, use str.extract.
  df[df['event_time'].str.contains('|'.join(substr), regex=True)]
Run Code Online (Sandbox Code Playgroud)

从正则表达式模式中删除捕获组:

urls = pd.DataFrame({'url': ['g.*']})   
Run Code Online (Sandbox Code Playgroud)

避免UserWarning.


小智 8

您应该将re.escape(yourString)其用于传递给 contains 的字符串。


Cha*_*hak 6

由于regex=True提供了,sublist被视为正则表达式,在您的情况下包含捕获组(用括号括起来的字符串)。

您会收到警告,因为如果您想捕获某些内容,则无法使用str.contains(它根据提供的模式是否包含在字符串中返回布尔值)

显然,您可以抑制警告,但最好修复它们。

如果您确实想捕获某些内容,请转义括号块或使用str.extract 。


tot*_*ico 5

你可以str.match改用。在您的代码中:

res = df[df['event_time'].str.match('|'.join(substr), regex=True)]
Run Code Online (Sandbox Code Playgroud)

解释

str.contains当正则表达式包含组时触发警告,例如在 regex 中r'foo(bar)',该(bar)部分被视为一个组,因为它在括号中。因此,理论上您可以从正则表达式中提取它。

但是,警告首先没有意义contains应该只“测试模式或正则表达式是否包含在系列或索引的字符串中”(熊猫文档)。没有关于提取组的内容。

在任何情况下,str.match都不会抛出警告,并且目前几乎与str.contains除了 (1) 字符串必须完全匹配和 (2) 不能停用正则表达式str.match(str.contains有一个regex参数可以停用它们)