Pandas如何提取多括号内以数字开头的子串 解决正则贪婪匹配问题
解决方案
直接调整正则规则即可解决两个问题:
- 替换原正则的贪婪匹配模式,匹配时遇到第一个右括号就终止,不会跨括号抓取多组内容
- 增加开头数字校验,仅保留左括号后紧跟数字的括号内内容
修正后代码
import pandas as pd cols = ['a', 'b'] data = [ ['xyz - (4 inch), (four inch)', 'abc'], ['def', 'ghi'], ['xyz - ( 5.5 inch), (five inch)', 'abc'], ] df = pd.DataFrame(data=data, columns=cols) # 替换为修正后的正则 df['c'] = df['a'].str.extract(r"\((\d[^)]*)\)") print(df)
正则规则说明
使用的正则为\((\d[^)]*)\),各部分逻辑:
\(:匹配左括号字符- 捕获分组(即最终提取的内容):
\d:要求内容必须以数字开头,左括号后如果是空格、字母等非数字字符则不匹配[^)]*:匹配任意数量的非右括号字符,遇到第一个右括号就停止,从根源避免贪婪匹配跨括号的问题
\):匹配右括号字符
运行结果
执行后输出和期望完全一致:
a b c 0 xyz - (4 inch), (four inch) abc 4 inch 1 def ghi NaN 2 xyz - ( 5.5 inch), (five inch) abc NaN
如果后续规则调整,允许括号内数字前存在空格等空白字符,可以把正则修改为
\(\s*(\d[^)]*)\)适配场景。
内容的提问来源于stack exchange,提问作者ah2Bwise
相关产品推荐
相关产品推荐

