2017-06-09 16 views
6

Có cách nào để sử dụng cùng tên trong nhóm có tên regex trong python không? ví dụ: (?P<n>foo)|(?P<n>bar).python regex: tên trùng lặp trong các nhóm có tên

Sử dụng trường hợp: tôi đang cố gắng để nắm bắt typeid với regex này:
/(?=videos)((?P<type>videos)/(?P<id>\d+))|(?P<type>\w+)/?(?P<v>v)?/?(?P<id>\d+)?
từ chuỗi này:

  • /kênh/v/123
  • /ch/v/41.500.082
  • /channel
  • /videos/41500082

Đối với bây giờ tôi nhận được lỗi: redefinition of group name 'id' as group 6; was group 3

+0

Một nhóm bị bắt có tên là duy nhất, trừ khi bạn đang sử dụng một thiết lập lại chi nhánh chỉ được hỗ trợ bởi mô đun 'regex' mới hơn:' (? | ...) '- bạn có bản trình diễn trực tuyến về những gì bạn đang cố gắng đạt được không? Ngoài ra, một regex có điều kiện hoặc lookarounds rất có thể sẽ đủ. – Jan

Trả lời

7

Câu trả lời là: Python re không hỗ trợ hệt tên nhóm.

Python PyPi regex module hỗ trợ một reset tính năng chi nhánh:

Branch reset

(?|...|...)

Capture group numbers will be reused across the alternatives, but groups with different names will have different group numbers.

Examples:

>>> regex.match(r"(?|(first)|(second))", "first").groups()
('first',)
>>> regex.match(r"(?|(first)|(second))", "second").groups()
('second',)

Note that there is only one group.

Và đây là một live Python 2.7 demo:

import regex 
s = "foo bar" 
rx = regex.compile(r"(?P<n>foo)|(?P<n>bar)") 
print([x.group("n") for x in rx.finditer(s)]) 
// => ['foo', 'bar'] 
Các vấn đề liên quan