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

Python:UserWarning:此模式具有匹配组。要实际获取组,请使用str.extract,python,regex,pandas,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.14593303

我有一个数据帧,我尝试获取字符串,其中列的上包含一些字符串 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
和另一个带有URL的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
我用

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)]
但它会回报我

UserWarning: This pattern has match groups. To actually get the groups, use str.extract.

如何修复此问题?

URL中至少有一个正则表达式模式必须使用捕获组。
str.contains
仅为
df['event\u time']中的每一行返回True或False
-- 它不使用捕获组。因此,
UserWarning
正在提醒您 正则表达式使用捕获组,但未使用匹配项

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

或者,您可以通过放置

import warnings
warnings.filterwarnings("ignore", 'This pattern has match groups')
在调用
str.contains
之前


下面是一个简单的示例,演示了问题(和解决方案):

印刷品

  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)]
从正则表达式模式中删除捕获组:

urls = pd.DataFrame({'url': ['g.*']})   

避免用户警告。

由于提供了
regex=True
子列表将被视为regex,在您的情况下,它包含捕获组(用括号括起来的字符串)

得到警告的原因是,如果要捕获某些内容,则不使用(返回布尔值,具体取决于所提供的模式是否包含在字符串中)

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


如果您真的想捕获某些内容,可以转义括号块或使用

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


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

,您应使用
re.escape(yourString)
作为要传递给contains的字符串。

您可以改用。在代码中:

res=df[df['event_time'].str.match('|'.join(substr),regex=True)]


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

然而,警告首先没有意义,
包含
应该只“测试序列或索引的字符串中是否包含模式或正则表达式”()。没有关于提取组的任何内容


在任何情况下,
str.match
都不会抛出警告,目前的警告与
str.contains
几乎相同,只是(1)字符串必须完全匹配,(2)不能从
str.match
中停用regex(
str.contains
有一个
regex
参数来停用它们)

最佳答案。
urls = pd.DataFrame({'url': ['g.*']})