zoukankan      html  css  js  c++  java
  • Python正则匹配字母大小写不敏感在读xml中的应用

    需要解决的问题:要匹配字符串,字符串中字母的大小写不确定,如何匹配?

    问题出现之前是使用字符串比较的方式,比如要匹配'abc',则用语句:

    1 if s == 'abc':#s为需要匹配的字符串
    2     print '匹配成功\n'

    现在的问题是s可能是Abc、ABC等等,所以需要大小写不敏感的匹配,如果把需要匹配的模式的大小写进行罗列,那即使是三个字母的短模式也是很麻烦,查了一下,正则表达式re模块中有个参数flags=re.I,这样就可以大小写不敏感的匹配了,示例如下:

    1 import re
    2 
    3 s = 'Abc'
    4 p = 'abc'
    5 p = re.compile(p,re.I)
    6 print re.search(p,s).group()

    匹配成功,输出结果:'Abc'

    Re模块中compile函数的使用 :

    预编译在python正则匹配中不是必须的,但是最好预编译一下,提升效率(多次使用,及时存缓存,也节省了查缓存等时间)。Re模块中的flag参数值可选范围如下表:

    (可查文档re模块)

    标志

    含义

    DOTALL, S

    使 . 匹配包括换行在内的所有字符

    IGNORECASE, I

    使匹配对大小写不敏感

    LOCALE, L

    做本地化识别(locale-aware)匹配

    MULTILINE, M

    多行匹配,影响 ^ 和 $

    VERBOSE, X

    能够使用 REs 的 verbose 状态,使之被组织得更清晰易懂

    这个表中Flags参数的值对search函数直接用也是可以的,如re.searchi(pattern,string,flags)

    下一个问题,如何匹配大小写不确定的xml元素中的属性名呢:

    既然可以不敏感的匹配字母的大小写,那么如果要匹配xml元素节点,要获取该节点的值怎么做呢?

    思路是这样的:要获取属性值,则要得到属性名,但是怎么准确知道属性名哪个字母大写哪个字母小写呢,这是个问题

                      方法是利用元素tag找到所在元素,然后取出元素的所有属性名,挨个匹配,找出所需的就停止,这样匹配元素属性名成功后,re.search(p,s,f).group()就是该属性当前的名了

    需要解析的xml文件(abc.xml)如下:

    1 <root>
    2     <element  name = 'who'  /element1>
    3     <element  Name = 'am'  /element1>
    4     <element  NAME = 'I'  /element1>
    5 </root>

    解析的代码如下:

     1 import re
     2 import xml.etree.Element as etree
     3 
     4 file = 'abc.xml'
     5 p = 'name'
     6 pattern = re.compile(p,re.I)
     7 tree = etree.parse(file)
     8 root = tree.getroot()
     9 result = []
    10 result = tree.findall('.//element')
    11 for i in result:
    12     for j in i.attrib.keys():
    13         try:
    14             r = re.search(pattern,j).group()
    15             #输出匹配的name属性名和对应的属性值
    16             print 'attrib is %s,and the value is %s\n'%r%i.attrib[r]        
    17             break
    18         except AttributeError,e:
    19             pass
    20             

    输出的结果如下:

    1 attrib is name,and the value is who
    2 attrib is Name,and the value is am
    3 attrib is NAME,and the value is I

    最后记录下:Str.Strip()参数为空可以去掉字符串首尾的特殊字符,很好用~

  • 相关阅读:
    第五周学习进度条
    课堂实验4.1(环数组)
    每日站立会议(3)
    每日站立会议(2)
    找水王
    购买一批书的最低价格
    每日站立会议(1)
    NABCD分析
    团队开发博客
    返回一个二维整数数组中的最大子数组之和(环)
  • 原文地址:https://www.cnblogs.com/followyourheart1990/p/4286637.html
Copyright © 2011-2022 走看看