簡體   English   中英

Square Brackets []的Python正則表達式行為

[英]Python Regex behaviour with Square Brackets []

這是文本文件abc.txt

的abc.txt

aa:s0:education.gov.in
bb:s1:defence.gov.in
cc:s2:finance.gov.in

我試圖通過使用以下正則表達式對每個“:”進行標記化(糾正我,如果這是不正確的術語:))來解析此文件。

parser.py

import re,sys,os,subprocess
path = "C:\abc.txt"
site_list = open(path,'r')
for line in site_list:
    site_line = re.search(r'(\w)*:(\w)*:([\w\W]*\.[\W\w]*\.[\W\w]*)',line)
    print('Regex found that site_line.group(2) = '+str(site_line.group(2))

為什么輸出

Regex found that site_line.group(2) = 0
Regex found that site_line.group(2) = 1
Regex found that site_line.group(2) = 2

有人可以幫我理解為什么它匹配第二組的最后一個字符? 我認為它從s0匹配0,從s2和s2匹配1

但為什么 ?

讓我們看一個簡化的例子:

>>> re.search(r'(.)*', 'asdf').group(1)
'f'
>>> re.search(r'(.*)', 'asdf').group(1)
'asdf'

如果您在捕獲組周圍有重復操作符,則該組將存儲最后一次重復。 將組放在重復運算符周圍可以實現您想要的效果。

如果您希望看到來自第三組的數據,那就是group(3) group(0)是整個匹配, group(1)group(2)等通過實際的括號內的捕獲組進行計數。

也就是說,正如評論所表明的那樣,正則表達式對此非常有用。

>>> 'aa:s0:education.gov.in'.split(':')
['aa', 's0', 'education.gov.in']

第一組 默認 為完全匹配

如果groupN參數為零,則相應的返回值是整個匹配字符串。

所以你應該跳過它。 並檢查group(3) ,如果你想要最后一個。

此外,您應該在for循環之前編譯regexp。 它提高了解析器的性能。

你可以將(\\w)*替換為(\\w*) ,如果你想匹配所有符號:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM