正则表达式:从URL中提取特定值

时间:2017-06-05 10:15:20

标签: python regex pandas parsing dataframe

我在使用re库从URL确定字符串时遇到了一些麻烦。

这是一个例子:

http://www.example.it/remoteconnexion.aspx?u=xxxxx@abc.it&direction=vente.aspx%3pid%xx123%63abcd"

我有一个数据框,我想使用其他列中的值添加列,在此示例中,df [' URL_REG']包含:' 123'?

df['URL_REG'] = df['URL'].map(lambda x : re.findall(r'[REGEX]+', x)[0])

URL的结构可以改变,但我想要的部分总是来自' direction = vente.aspx%3pid%'和'%'。

2 个答案:

答案 0 :(得分:2)

使用矢量化Series.str.extract()方法:

In [50]: df['URL_REG'] = df.URL.str.extract(r'direction=vente.aspx\%3pid\%([^\%]+)\%*',
                                            expand=False)

In [51]: df
Out[51]:
                                                 URL URL_REG
0  http://www.example.it/remoteconnexion.aspx?u=x...   xx123

<强>更新

  

我只想'123'而不是'xx123',其中'xx'是十六进制数

In [53]: df['URL_REG'] = df.URL.str.extract(r'direction=vente.aspx\%3pid\%\w{2}(\d+)\%*', 
                                            expand=False)

In [54]: df
Out[54]:
                                                 URL URL_REG
0  http://www.example.it/remoteconnexion.aspx?u=x...     123

答案 1 :(得分:0)

您可以使用此模式:

import re

url='http://www.example.it/remoteconnexion.aspxu=xxxxx@abc.it&direction=vente.aspx%3pid%xx123%63abcd'
output = re.findall('3pid%(.*?)%', url)

print(output)

输出:

['xx123']

然后将相同的模式应用于您的DataFrame。

例如:

import pandas as pd
import re

df = pd.DataFrame(['http://www.example.it/remoteconnexion.aspx?u=xxxxx@abc.it&direction=vente.aspx%3pid%xx123%63abcd'], columns = ['URL'])

output = df['URL'].apply(lambda x : re.findall('3pid%(.*?)%', x))

print(output)

# Or, maybe if you want to return the url and the data captured:
# output = df['URL'].apply(lambda x : (x, re.findall('3pid%(.*?)%', x)))
# output[0]
# >>> ('http://www.example.it/remoteconnexion.aspx?u=xxxxx@abc.it&direction=vente.aspx%3pid%xx123%63abcd', 
#   ['xx123'])

输出:

0    [xx123]
Name: URL, dtype: object