Python Regex - Cách Nhận Vị trí và Giá trị của các Trận đấu


112

Làm cách nào để tôi có được vị trí bắt đầu và kết thúc của tất cả các trận đấu bằng cách sử dụng remô-đun? Ví dụ, cho mẫu r'[a-z]'và chuỗi 'a1b2c3d4'tôi muốn lấy các vị trí mà nó tìm thấy mỗi chữ cái. Tốt nhất, tôi cũng muốn lấy lại văn bản của trận đấu.


Xem liệu điều này có giúp đối sánh các đối tượng không
EBGreen 30/10/08

Câu trả lời:


140
import re
p = re.compile("[a-z]")
for m in p.finditer('a1b2c3d4'):
    print(m.start(), m.group())

3
Điều này không cung cấp chỉ số của các nhóm khác trong một regex match = r '([az]) (0-9)' m.start sẽ cho nhóm (), chứ không phải nhóm (1)
StevenWernerCS

@StevenWernerCS start()có thể chấp nhận số nhóm, vì vậy nếu bạn muốn có chỉ mục của nhóm thứ n, hãy sử dụngstart(n)
Hi-Angel

@ hi-angel yep, hãy xem câu trả lời của tôi bên dưới từ năm ngoái, điều đó làm được điều đó
StevenWernerCS

51

Được lấy từ

Biểu thức chính quy HOWTO

span () trả về cả chỉ mục bắt đầu và kết thúc trong một bộ giá trị duy nhất. Vì phương thức so khớp chỉ kiểm tra xem RE có khớp ở đầu chuỗi hay không, nên start () sẽ luôn bằng 0. Tuy nhiên, phương pháp tìm kiếm của các cá thể RegexObject quét qua chuỗi, do đó, đối sánh có thể không bắt đầu từ 0 trong trường hợp đó.

>>> p = re.compile('[a-z]+')
>>> print p.match('::: message')
None
>>> m = p.search('::: message') ; print m
<re.MatchObject instance at 80c9650>
>>> m.group()
'message'
>>> m.span()
(4, 11)

Kết hợp điều đó với:

Trong Python 2.2, phương thức finditer () cũng có sẵn, trả về một chuỗi các cá thể MatchObject dưới dạng một trình lặp.

>>> p = re.compile( ... )
>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')
>>> iterator
<callable-iterator object at 0x401833ac>
>>> for match in iterator:
...     print match.span()
...
(0, 2)
(22, 24)
(29, 31)

bạn sẽ có thể làm điều gì đó theo thứ tự

for match in re.finditer(r'[a-z]', 'a1b2c3d4'):
   print match.span()

Bạn có thể sử dụng nó như re.search(r'abbit', "has abbit of carrot").span(0)-(4, 9)
Константин Ван

'Chỉ mục kết thúc' được trả về span()giống như 'điểm dừng' trong ký hiệu lát cắt của Python ở chỗ nó đi lên nhưng không bao gồm chỉ mục đó; xem tại đây .
Wayne

20

Đối với Python 3.x

from re import finditer
for match in finditer("pattern", "string"):
    print(match.span(), match.group())

Bạn sẽ nhận được \ncác bộ giá trị riêng biệt (bao gồm các chỉ số đầu tiên và chỉ số cuối cùng của trận đấu, tương ứng) và chính trận đấu, cho mỗi lần truy cập trong chuỗi.


2

lưu ý rằng span & group được lập chỉ mục cho nhiều nhóm nắm bắt trong một regex

regex_with_3_groups=r"([a-z])([0-9]+)([A-Z])"
for match in re.finditer(regex_with_3_groups, string):
    for idx in range(0, 4):
        print(match.span(idx), match.group(idx))

1
Cảm ơn, điều này đã được chứng minh là siêu hữu ích và dường như khá bị chôn vùi. Ngoài ra, trong trường hợp bất kỳ ai cần điều này: khi sử dụng các nhóm nắm bắt được đặt tên, người ta có thể tìm chỉ mục của một nhóm bằng cách sử dụng <match> .re.groupindex và từ đó tìm khoảng tương ứng bằng cách sử dụng phương pháp bạn đã nêu
madimov

4đến từ đâu
Đài kiểm soát

@RadioControlled number_of_known_groups_in_the_regex + 1, vì phạm vi là [bắt đầu, kết thúc) không bao gồm kết thúc
StevenWernerCS

@StevenWernerCS vì vậy nó không khái quát cho các trường hợp không xác định được số lượng nhóm ...
Radio Kiểm soát
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.