我如何在python中使用正则表达式返回子字符串

时间:2018-01-26 19:57:33

标签: python regex pandas

我正在清理数据集,我想从Pandas系列中提取一些功能(并删除没有这些功能的行)。

基本上我想转此:

meter
Author: Stephen Duck Metrical foot type: iambic (-+) Metrical foot number: pentameter (5 feet)  Rhyme scheme: aa  
Author: Marko bulk Metrical foot type: anapaestic (--+) Metrical foot number: trimeter Rhyme scheme: ababcdcd

到此:

foot         feet_number
iambic       pentameter
anapaestic   trimeter

我已经设法使用下面的代码执行此操作,我制作了本系列的副本以使用替换功能。

它不是Pythonic,我确定它也不是最有效地使用大熊猫。我遍历它两次找到第一个特征,然后另外两个循环找到第二个特征。

这是第一个特征(对于具有不同模式的第二个特征,相同)

pattern1=r'.* Metrical foot type: '
pattern2=r'\( .* \) Metrical foot number: '

dataset['meter']=dataset['meter'].str.replace(pattern1, "")
dataset['meter']=dataset['meter'].str.replace(pattern2, "")

然后循环删除没有这两个功能的行。

任何想法如何改进?

1 个答案:

答案 0 :(得分:0)

您可以将str.extract()与以下表达式一起使用:

foot type:\s+(?P<foot>\w+)
.*?
foot number:\s+(?P<feet_number>\w+)

<小时/> 在Python

import pandas as pd

df = pd.DataFrame({'meter': ['Author: Stephen Duck Metrical foot type: iambic (-+) Metrical foot number: pentameter (5 feet)  Rhyme scheme: aa', 'Author: Marko bulk Metrical foot type: anapaestic (--+) Metrical foot number: trimeter Rhyme scheme: ababcdcd']})

df[['foot', 'feet_number']] = df['meter'].str.extract(r'foot type:\s+(?P<foot>\w+).*?foot number:\s+(?P<feet_number>\w+)', expand=True)
print(df)

这会产生:

                                               meter        foot feet_number
0  Author: Stephen Duck Metrical foot type: iambi...      iambic  pentameter
1  Author: Marko bulk Metrical foot type: anapaes...  anapaestic    trimeter

<小时/> 请参阅a demo for the expression on regex101.com