用python正则表达式提取非ASCII字符的单词

时间:2016-12-25 10:44:32

标签: python html regex

我想提取一些包含非ASCII字符的文本。问题是该程序将非ASCII视为分隔符! 我试过这个:

regex_fmla = '(?:title=[\'"])([:/.A-z?<_&\s=>0-9;-]+)'
c1='<a href="/climate/cote-d-ivoire.html" title="Climate data: Côte d\'Ivoire">Côte d\'Ivoire</a>'
c2= '<a href="/climate/cameroon.html" title="Climate data: Cameroon">Cameroon</a>'
c_list =[c1, c2]
for c in c_list 
    print re.findall(regex_fmla , c)

结果是:

['Climate data: C']
['Climate data: Cameroon']

请注意,第一个国家正确,因为系列在ô处断开,应该是:

['Climate data: Côte d\'Ivoire']

我在StackOverflow中搜索过,我找到了一个建议使用标志re.UNICODE的答案,但它返回了相同的错误答案!

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:6)

我建议使用BeautifulSoup来解析html:

from bs4 import BeautifulSoup as bs

c1='<a href="/climate/cote-d-ivoire.html" title="Climate data: Côte d\'Ivoire">Côte d\'Ivoire</a>'
c2='<a href="/climate/cameroon.html" title="Climate data: Cameroon">Cameroon</a>'


for c in [c1, c2]:
    soup = bs(c, 'html.parser')
    print(soup.find('a')['title'])

了解更多链接(<a ...>)使用.findAll()方法:

for c in [bightml]:
    soup = bs(c, 'html.parser')
    for a in soup.findAll('a'):
        print(a['title'])

如果您需要具有title属性的任何内容:

for a in soup.findAll(title=True):
    print(a['title'])

答案 1 :(得分:2)

我也建议BeautifulSoup,但似乎您想知道如何包含这些特殊字符,您可以将正则表达式更改为:

ex = 'title="(.+?)"'

然后:

c1='<a href="/climate/cote-d-ivoire.html" title="Climate data: Côte d\'Ivoire">Côte d\'Ivoire</a>'

for x in re.findall(ex, c1):
    print x

<强>输出:

Climate data: Côte d'Ivoire

答案 2 :(得分:0)

我建议使用美味的汤,但如果你更喜欢坚持:

import re

regex_fmla = '(?:title=[\'"])([\w :\':/.]+)'

c1 = '<a href="/climate/cote-d-ivoire.html" title="Climate data: Côte d\'Ivoire">Côte d\'Ivoire</a>'
c2 = '<a href="/climate/cameroon.html" title="Climate data: Cameroon">Cameroon</a>'
c_list = [c1, c2]

for c in c_list:
    print(re.findall(regex_fmla, c, flags=re.UNICODE))

我认为导致re.UNICODE无效的问题是明确将表达式中的字母定义为[A-z0-9]。如果我们将其更改为[\w],那么该标志就可以正常工作