regex - 提取字符串中的匹配位置
问题描述
re.finditer
我可以使用生成匹配的开始/结束位置的元组轻松提取文本中字符串的开始/结束位置。
s1 = 'the quick quick brown fox jumps over the lazy dog'
s2 = 'Pack my box with five dozen liquor jugs'
s3 = 'How razorback jumping frogs can level six piqued gymnasts'
r1 = '(quick|fox|dog)'
r2 = '(box|five|jugs)'
r3 = '(frogs|six)'
t = [(s1,r1), (s2,r2), (s3,r3)]
for e in t:
print([(f.start(), f.end()) for f in re.finditer(e[1],e[0])])
[(4, 9), (10, 15), (22, 25), (46, 49)]
[(8, 11), (17, 21), (35, 39)]
[(22, 27), (38, 41)]
我有一个数据框,其中一列中有文本,另一列中有正则表达式
s = pd.DataFrame(data={'re':[r1,r2,r3], 'text':[s1,s2,s3]})
re text
0 (quick|fox|dog) the quick quick brown fox jumps over the lazy dog
1 (box|five|jugs) Pack my box with five dozen liquor jugs
2 (frogs|six) How razorback jumping frogs can level six piqu...
我想Series
使用方法将相同的位置信息提取到对象中,pandas.str
但没有finditer
方法(在熊猫 0.23 中)。
有没有办法在不诉诸 for-each 循环的情况下做到这一点?
解决方案
扩展 @user3483203 评论,您可以使用列表理解执行以下操作:
import re
import pandas as pd
s1 = 'the quick quick brown fox jumps over the lazy dog'
s2 = 'Pack my box with five dozen liquor jugs'
s3 = 'How razorback jumping frogs can level six piqued gymnasts'
r1 = '(quick|fox|dog)'
r2 = '(box|five|jugs)'
r3 = '(frogs|six)'
t = [(s1,r1), (s2,r2), (s3,r3)]
s = pd.DataFrame(data={'re':[r1,r2,r3], 'text':[s1,s2,s3]})
result = pd.Series([[(f.start(), f.end()) for f in re.finditer(p, s)] for p, s in zip(s.re, s.text)])
print(result)
输出
0 [(4, 9), (10, 15), (22, 25), (46, 49)]
1 [(8, 11), (17, 21), (35, 39)]
2 [(22, 27), (38, 41)]
dtype: object
另一种选择是使用apply,但我相信这可能会更慢:
def finditer(p, s):
return [(f.start(), f.end()) for f in re.finditer(p, s)]
result = s[['re', 'text']].apply(lambda x: finditer(x[0], x[1]), axis=1)
print(result)
推荐阅读
- python - Python:在一个项目中使用支持不同 Python 版本的模块
- vuejs2 - vue2 - '$store is undefined' when used in component
- java - 扩展 JPanel 以绘制图像。但是在同一个面板上添加到 JFrame
- android - 为什么我在 Firebase 中的 onChildAdded 中出现 NullPointerException?
- python - DJANGO MODELS, use one class objects in another class (ManyToManyField) (?)
- python - 如何从元组列表和列表中获得数据框的单独列
- reactjs - webpack-dev-server 以状态码 1 退出
- reactjs - 无法从 id 路由中获取参数
- c++ - 如何为所有非数组类型专门化一个模板?
- qt - Chromium/PyQt5 support for MP4