我已经得到了这个pandas DataFrame,它是对足球比赛中的比赛的描述:
<表类>
play_id
类型
文本
tbody><<tr>1 通过 Jon通过完成本。 2 pass 时钟14时52分,Jon完成传给Mitch。 3 冲 弗兰克。 表类>
- 使用正向向前看条件的
pandas.Series.str.extract
。- 参见SO: Regex向前看,向后看和原子组,了解
lookahead
的详细解释。 s+pass
将适用于名称和'pass'
(例如'Jon PaSs'
)之间的任何数量的空白
- 参见SO: Regex向前看,向后看和原子组,了解
flags=re.IGNORECASE
用于忽略'pass'
的大小写df.Text.str.lower().str.extract('(w+(?=s+pass))')
可以代替导入re
。
import pandas as pd
import re
# test dataframe
data = {'play_id': ['1', '2', '3'], 'type': ['pass', 'pass', 'rush'], 'Text': ['Jon PASS complete to Ben.', 'Clock 14:52, Jon pass complete to Mitch.', 'Frank rush.']}
df = pd.DataFrame(data)
# display(df)
play_id type Text
1 pass Jon PASS complete to Ben.
2 pass Clock 14:52, Jon pass complete to Mitch.
3 rush Frank rush.
# extract
df['passer'] = df.Text.str.extract('(w+(?=s+pass))', flags=re.IGNORECASE)
# display(df)
play_id type Text passer
1 pass Jon PASS complete to Ben. Jon
2 pass Clock 14:52, Jon pass complete to Mitch. Jon
3 rush Frank rush. NaN
尝试使用(?=)
为正向前看,一种类型的零宽度断言。因此,代码看起来像:
df['passer'] = df['Text'].str.extract(r'(w+)(?=spass)', expand=False)
输出:
| play_id | type | Text | passer |
| -------- | ----- | ---------------------------------------- | ------ |
| 1 | pass | Jon pass complete to Ben. | Jon |
| 2 | pass | Clock 14:52, Jon pass complete to Mitch. | Jon |
| 3 | rush | Frank rush. | NaN |