2009-11-09 101 views
1

你如何在Python中使用正則表達式用一個for循環正則表達式中的for循環

example data 
abc 1 xyz 0 
abc 2 xyz 1 
abc 3 xyz 2 

怎麼寫正則表達式類似下面

for i in range(1, 3): 
    re.match(abc +i xyz +(i-1)) 
+1

你的示例代碼有什麼問題(除了它缺少關閉的parenthenis和一些引號)? – 2009-11-09 07:05:09

+0

新的python和正則表達式, 有問題與變量「我」正則表達式作爲字母對待。 – user204488 2009-11-09 07:15:04

+0

請發佈您嘗試過的正則表達式。當你說「變量的問題'我'」,請張貼錯誤追溯和正則表達式的問題。請提供哪些內容不適合您的詳細信息。 – 2009-11-09 11:11:32

回答

3

這種替代i進入第一%si-1分成第二個%s

re.match("abc %s xyz %s"%(i,i-1), data) 

另一種方式來寫這將是

re.match("abc "+str(i)+" xyz "+str(i-1), data) 
+0

感謝您的信息 – user204488 2009-11-09 07:38:53

2

你不能讓一個單一的正則表達式,其中包括它在正則表達式匹配時計算數學表達式。但是,您可以動態生成正則表達式,使用普通的Python字符串格式化技術:

import re 

example_data = """ 
this line will not match 
abc 1 xyz 0 
this line will not match 
abc 2 xyz 1 
abc 2 xyz 2 will not match 
abc 3 xyz 2 
""" 

for i in range(1, 4): 
    pattern = "abc %d xyz %d" % (i, (i - 1)) 
    match_group = re.search(pattern, example_data) 
    if match_group: 
     print match_group.group(0) 

這將打印:

abc 1 xyz 0 
abc 2 xyz 1 
abc 3 xyz 2 

這可能是一個更好的主意,這樣做的abyx建議,並作出單正則表達式與幾個比賽團體,並做基於匹配組捕獲的子數學:

import re 

example_data = """ 
this line will not match 
abc 1 xyz 0 
this line will not match 
abc 2 xyz 1 
abc 2 xyz 2 will not match 
abc 3 xyz 2 
""" 
s_pattern = "abc (\d+) xyz (\d+)" 

pat = re.compile(s_pattern) 
# note that you can pre-compile the single pattern 
# you cannot do that with the dynamic patterns 

for match_group in re.finditer(pat, example_data): 
    n1 = int(match_group.group(1)) 
    n2 = int(match_group.group(2)) 
    if n1 > 0 and n1 == n2 + 1: 
     print match_group.group(0) 

這也將打印:

abc 1 xyz 0 
abc 2 xyz 1 
abc 3 xyz 2