Python正则表达式问题
我正在尝试使用下面的 Python 脚本从 WURFL XML 文件中提取所有手机屏幕分辨率。问题是我只得到了第一场比赛。为什么?我怎样才能获得所有匹配项?
WURFL XML 文件可以在 http 中找到://sourceforge.net/projects/wurfl/files/WURFL/latest/wurfl-latest.zip/download?use_mirror=freefr
def read_file(file_name):
f = open(file_name, 'rb')
data = f.read()
f.close()
return data
text = read_file('wurfl.xml')
import re
pattern = '<device id="(.*?)".*actual_device_root="true">.*<capability name="resolution_width" value="(\d+)"/>.*<capability name="resolution_height" value="(\d+)"/>.*</device>'
for m in re.findall(pattern, text, re.DOTALL):
print(m)
I'm trying to extract ALL phone screen resolutions from the WURFL XML file with the below Python script. The problem is that I only get the first match, though. Why? How could I get all matches?
The WURFL XML file can be found at http://sourceforge.net/projects/wurfl/files/WURFL/latest/wurfl-latest.zip/download?use_mirror=freefr
def read_file(file_name):
f = open(file_name, 'rb')
data = f.read()
f.close()
return data
text = read_file('wurfl.xml')
import re
pattern = '<device id="(.*?)".*actual_device_root="true">.*<capability name="resolution_width" value="(\d+)"/>.*<capability name="resolution_height" value="(\d+)"/>.*</device>'
for m in re.findall(pattern, text, re.DOTALL):
print(m)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
首先,使用 XML 解析器而不是正则表达式。从长远来看,你会更快乐。
其次,如果您坚持使用正则表达式,请使用
finditer()
而不是findall()
。第三,您的正则表达式从第一个条目到最后一个条目匹配(
.*
是贪婪的,并且您已设置DOTALL
模式),因此请查看第一段或在至少将正则表达式更改为此外,始终将原始字符串与正则表达式一起使用。
\d
恰好可以工作,但是\b
在“正常”字符串中会出现意外的行为。First, use an XML parser instead of regular expressions. You'll be happier in the long run.
Second, if you insist on using regexes, use
finditer()
instead offindall()
.Third, your regex matches from the first entry to the last one (the
.*
is greedy, and you have setDOTALL
mode), so either see the first paragraph or at least change your regex toAlso, always use raw strings with regexes.
\d
happens to work,\b
will behave unexpectedly in a "normal" string, though.这是 findall 行为的一个奇怪之处,具体来说,findall 只返回每个模式匹配中的第一个匹配组。请参阅此问题。
This is an oddness in the behaviour of
findall
, specificallyfindall
only returns the first matching group from each pattern match. See this question.您正在使用“贪婪”匹配:
.*
将匹配尽可能多的文本,这意味着
之前的.*
> 匹配大部分文件。You are using "greedy" matches:
.*
will match as much text as it can grab, which means the.*
before<capabilities>
matches most of the file.如果需求很简单,我当然不反对使用正则表达式处理 xml,但也许在这种情况下使用真正的 xml 解析器会更好。使用 stdlib etree 模块和一些(恕我直言)丑陋的 xpath:
I'm certainly not averse to handling xml with a regexp if the requirements are simple, but perhaps in this case using a real xml parser would be better. Using the stdlib etree module and a sprinkling of (imho) hideous xpaths: