2012-02-01 29 views
5
#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import re 

text = "aaaa[ab][cd][ef]" 

a = re.compile("^(\w+)(\[\w+\])*$").findall(text) 

print a 

tôi cần tất cả chúng nhưng nó sẽ trả về:python: regex chỉ được xuất hiện cuối cùng

[('aaaa', '[ef]')] 

với:

a = re.compile("\[\w+\]").findall(text) 

tôi nhận được tất cả trong số họ nhưng từ đầu tiên là ra ...

['[ab]', '[cd]', '[ef]'] 

văn bản này là văn bản ngẫu nhiên tôi đặt điều này vì o f chất lượng stackoverflow standars

Trả lời

0

cuối cùng tôi làm điều đó với mã này:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import re 

text = "aaaa[ab][cd][ef]" 

var = [] 
if re.match("^(\w+)(\[\w+\])*$", text): 
     a = re.findall("^\w+", text)[0] 
     var.append(a) 
     b = re.findall("\[\w+\]", text) 
     for i in b: 
       var.append(i) 
print var 

đầu ra:

['aaaa', '[ab]', '[cd]', '[ef]'] 

tất cả các giải pháp này là tuyệt vời, cảm ơn :)

3

Đây là cách bạn có thể làm điều đó:

In [14]: a = re.compile(r"(\w+|\[\w+\])").findall(text) 

In [15]: print a 
['aaaa', '[ab]', '[cd]', '[ef]'] 

Mỗi trận đấu trở về một nhóm các chữ cái (có hoặc không có dấu ngoặc).

+0

mmm nhưng nó hoạt động mà không có từ đầu tiên ... grgrgrgrgrgr – ZiTAL

1

Chỉ có một kết quả phù hợp: phần "^(\w+)" khớp với "aaaa""(\[\w+\])*$" đối sánh phần "[ab][cd][ef]". Lưu ý rằng bạn nhận được danh sách một phần tử (là một phần tử), do đó, chỉ có một kết quả phù hợp. Mỗi cặp dấu ngoặc đơn bạn sử dụng trong regexp tạo một phần tử trong bộ tuple, với văn bản khớp với bất kỳ thứ gì bên trong chúng. Có hai cặp, do đó, có hai phần tử trong bộ dữ liệu. Cặp ngoặc đơn thứ hai được gắn dấu sao, nhưng điều đó chỉ khiến kết quả đó được "gán" nhiều lần (dường như giữ giá trị cuối cùng): nó không nhân các dấu ngoặc đơn, vì vậy bạn không nhận được một bộ tuple lớn hơn.

Tôi không chắc chắn những gì bạn mong đợi, vì vậy tôi không biết những gì regexp để đề xuất.

+0

tôi sẽ làm điều đó trong 2 bước không có vấn đề :) cảm ơn vì thông tin – ZiTAL

1

Dựa trên nhận xét của bạn về câu trả lời của aix, có vẻ như bạn muốn yêu cầu phần không khớp với nhau, có thể một cái gì đó như thế này là những gì bạn đang tìm kiếm?

>>> a = re.compile(r"^(\w+)((?:\[\w+\])*)").findall(text) 
>>> print a 
[('aaaa', '[ab][cd][ef]')] 

Nếu bạn cần để có được những kết quả ['aaaa', '[ab]', '[cd]', '[ef]'] thay vì những gì được hiển thị trên đây là một trong những phương pháp:

>>> match = re.compile(r"^(\w+)((?:\[\w+\])*)").search(text) 
>>> a = [match.group(1)] + match.group(2).replace("][", "] [").split() 
>>> print a 
['aaaa', '[ab]', '[cd]', '[ef]'] 
Các vấn đề liên quan