Python正则表达式问题

标签 python xml regex wurfl

我正在尝试使用以下 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)

最佳答案

首先,使用 XML 解析器而不是正则表达式。从长远来看,你会更快乐。

其次,如果您坚持使用正则表达式,请使用 finditer() 而不是 findall()

第三,你的正则表达式从第一个条目到最后一个条目匹配(.*是贪婪的,并且你已经设置了DOTALL模式),所以要么看到第一个段落或至少将您的正则表达式更改为

pattern = r'<device id="(.*?)".*?actual_device_root="true">.*?<capability name="resolution_width" value="(\d+)"/>.*?<capability name="resolution_height" value="(\d+)"/>.*?</device>'

此外,始终将原始字符串与正则表达式一起使用。 \d 恰好可以工作,但是 \b 在“正常”字符串中会出现意外的行为。

关于Python正则表达式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5963225/

相关文章:

sql-server - XQuery - 迭代每个属性

java - JAVA将一个字符串分割成3个字符串,每个字符串都有自己的分隔符

javascript - 如何在执行 PHP 时动态编码为 Base64 "preg_replace"

python - 将 MySql 数据库值拉入列表存储 - Python3 和 Mysql.connector

python - 导入错误 : No module named 'resource_rc'

r - 使用rentrez在R中解析XML文件

xml - Scala XML 构建 : Adding children to existing Nodes

regex - sed 删除括号后的尾随空格

python - 如何使用剪贴板操作 (ctrl-c/ctrl-v) 复制/剪切/粘贴文件

python - 如何在 for 循环中从一个元素滚动到另一个元素?