我想从内容字符串中提取特定的模式:“ <a href="http://twitter.com/download/iphone" rel="nofollow"> iPhone版Twitter </a>”

时间:2019-07-31 19:03:42

标签: python regex pandas dataframe

我想从该字符串中提取“ Twitter for iPhone”部分。 但是在一个数据框的数千列中,“ iPhone的Twitter”的位置却有不同的值。我只需要以下字符串集中的“>”之后和“ <”之前的值。

我尝试了df.col.str.extract('(iPhone的Twitter |三星的Twitter |其他人的Twitter)'),它仅提取那些“ iPhone的Twitter”值,而不提取其他值,其余的都用NaN填充

3 个答案:

答案 0 :(得分:2)

执行@CMMCD的注释,此代码:

import pandas as pd

a = ["""<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for iPhone</a>""",
 """<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for Cats</a>"""
    ]

df = pd.DataFrame(a,columns=['WebLinks'])


df['WebLinks'].str.extract(r"\>(.*?)\<")

返回此结果:

0   Twitter for iPhone
1   Twitter for Cats

正在发生的事情是r"\>(.*?)\<"的意思是“正则表达式字符串,其模式匹配结束标签(\>和开始标签(\<)之间的任何内容。”我不建议摆脱这种方法的标签。

如果这不起作用,您可以发布给您nans的代码吗?

答案 1 :(得分:1)

尝试df.col.str.extract(pat = '(Twitter for (iPhone|Samsung|others))')

答案 2 :(得分:0)

您可以将col.str.split()与正则表达式模式r'<|>'一起使用,以获取列中元素的列表,然后选择所需的元素(请注意,假设整个数据元素都是所提供的字符串)

twits=['<a href=”http://twitter.com/download/iphone“ rel=”nofollow“>Twitter for iPhone</a>',
      '<a href=”http://twitter.com/download/iphone“ rel=”nofollow“>Twitter for Samsung</a>',
      '<a href=”http://twitter.com/download/iphone“ rel=”nofollow“>Twitter for Others</a>']

ser=pd.Series([np.random.choice(twits,1)[0] for i in range(10)])

ser.str.split(r'<|>').str[2]

0    Twitter for Samsung
1     Twitter for iPhone
2     Twitter for iPhone
3     Twitter for Others
4     Twitter for iPhone
5     Twitter for Others
6     Twitter for Others
7    Twitter for Samsung
8     Twitter for iPhone
9     Twitter for Others