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()參數為空可以去掉字符串首尾的特殊字符,很好用~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM