繁体   English   中英

Python re.findall

[英]Python re.findall

我正在尝试检索包含“名称”字段的所有标签,然后将整个句子加上名称。 这是我的测试代码:

sourceCode = '<dirtfields name="one" value="stuff">\n<gibberish name="two"\nwewt>'
namesGroup = re.findall('<.*name="(.*?)".*>', sourceCode, re.IGNORECASE | re.DOTALL)

for name in namesGroup:
    print name

哪个输出是:

two

我试图寻找的输出将是

['<dirtfields name="one" value="stuff">', 'one']
['<gibberish name="two"\nwewt>', 'two']

编辑:找到了一种方法,这要感谢doublesharp提供了更清晰的方法来获得“名称”值。

namesGroup = re.findall(r'(<.*?name="([^"]*)".*?>)', sourceCode, re.IGNORECASE | re.DOTALL)

将输出:

('<dirtfields name="one" value="stuff">', 'one')
('<gibberish name="two"\nwewt>', 'two')

您的正则表达式有点不对头-您匹配得太多了(一直到最后一个> )。 由于只需要在name=之后双引号之间的值,请使用以下模式:

name="([^"]*)"
  • name="与您要查找的属性的第一部分匹配
  • ([^"]*)根据不是双引号的任何字符创建分组匹配
  • "与名称属性值后的双引号匹配。

而且您的代码看起来像这样(在您的模式之前包含r是一个很好的形式):

namesGroup = re.findall(r'name="([^"]*)"', sourceCode, re.IGNORECASE)

显然,您正在处理HTMLXML文件,并正在寻找某些特定属性的值。

如果您继续使用正则表达式而不是合法的文本解析器,则会产生方向错误。

就像BeautifulSoup4一样,这是我最喜欢的一个,下面是一个非常简短的使用方法示例:

from bs4 import BeautifulSoup

sourceCode = '<dirtfields name="one" value="stuff">\n<gibberish name="two"\nwewt>'

soup = BeautifulSoup(sourceCode)
print soup.prettify()
print '------------------------'
for tag in soup.find_all():
    if tag.has_key('name'):
        print tag, tag['name']

现在的输出看起来有些丑陋(输出甚至是错误的),但这显示出beautifulsoup将如何自动修复损坏的html并轻松找到所需的属性。

<html>
 <body>
  <dirtfields name="one" value="stuff">
   <gibberish name="two" wewt="">
   </gibberish>
  </dirtfields>
 </body>
</html>
------------------------
<dirtfields name="one" value="stuff">
<gibberish name="two" wewt=""></gibberish></dirtfields> one
<gibberish name="two" wewt=""></gibberish> two

Beautifulsoup添加到您最喜欢的Stackoverflow标签中,您会惊讶的是它有多好,并且有一个功能强大的工具与您做着同样的事情!

(?<=name=")[^"]*

如果您只想匹配名称而没有捕获组,则可以使用:

re.findall(r'(?<=name=")[^"]*', sourceCode, re.IGNORECASE )

输出: ['one', 'two']

当然,捕获组是一个同样可以接受的解决方案。

这种模式允许值中包含转义的引号,并避免(出于性能原因)惰性量词。 这就是为什么它有点长但更防水的原因:

myreg = re.compile(r"""
    < (?: [^n>]+ | \Bn | n(?!ame\s*=) )+   # begining of the tag 
                                           # until the name attribute
    name \s* = \s* ["']?                   # attribute until the value
    ( (?: [^\s\\"']+ | \\{2} | \\. )* )    # value
    [^>]*>                                 # end of the tag
""", re.X | re.I | re.S)

namesGroup = myreg.findall(sourceCode)

但是,对于您的情况,使用BS4是一个不错的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM