如何在Python中使用正则表达式非捕获组格式

Sta*_*ser 5 python regex pandas

在下面的代码中,我只想获取“-”和“ u”之间的数字。我以为我可以应用正则表达式非捕获组格式(?:…)来忽略从'-'到第一位的所有内容。但是输出总是包含它。如何使用非捕获组格式生成正确的输出?

df = pd.DataFrame(
    {'a' : [1,2,3,4], 
     'b' : ['41u -428u', '31u - 68u', '11u - 58u', '21u - 318u']
    })

df['b'].str.extract('((?:-[ ]*)[0-9]*)', expand=True)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明 在此处输入图片说明

Pat*_*ner 5

它不包含在内部组中,但仍包含在外部组中。一个非捕获组并不一定意味着它根本没有被捕获……只是该组没有明确地保存在输出中。它仍然被捕获为任何封闭组的一部分。

只是不要将它们放入()定义捕获的:

import pandas as pd

df = pd.DataFrame(
    {'a' : [1,2,3,4], 
     'b' : ['41u -428u', '31u - 68u', '11u - 58u', '21u - 318u']
    })

df['b'].str.extract(r'- ?(\d+)u', expand=True)

     0
0  428
1   68
2   58
3  318
Run Code Online (Sandbox Code Playgroud)

这样一来,您就可以匹配'-'前面(后面是空格),'u'后面和后面两个数字之间的数字。

哪里,

-      # literal hyphen
\s?    # optional space—or you could go with \s* if you expect more than one
(\d+)  # capture one or more digits 
u      # literal "u"
Run Code Online (Sandbox Code Playgroud)

  • 这将返回一个<input>:1:DeprecationWarning:无效的转义序列\ d`。打开编译器警告。我建议您使用原始字符串。 (2认同)