[英]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)
显然,您正在处理HTML
或XML
文件,并正在寻找某些特定属性的值。
如果您继续使用正则表达式而不是合法的文本解析器,则会产生方向错误。
就像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.