Python正则表达式issu

2024-09-27 18:04:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用下面的Python脚本从wurflxml文件中提取所有的手机屏幕分辨率。但问题是我只得到第一场比赛。为什么?我怎么能弄到所有的火柴?在

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)

Tags: 文件textnamerereaddatavaluedevice
3条回答

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

第二,如果您坚持使用regex,请使用finditer(),而不是{}。在

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

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

此外,请始终将原始字符串与正则表达式一起使用。\d碰巧起作用,\b在“普通”字符串中会有意外的行为。在

{{{1}中每一个匹配的cd1}行为只返回一个匹配的cd1}。见this question。在

您使用的是“贪心”匹配:.*将匹配尽可能多的文本,这意味着<capabilities>之前的.*与大多数文件匹配。在

text = open('wurfl.xml').read()
pattern = r'<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

相关问题 更多 >

    热门问题