2017-06-09 23 views
5

Tôi đang cố gắng khớp tất cả các lần xuất hiện của Chuỗi Article theo sau bởi một số (một hoặc nhiều chữ số) là không theo sau là dấu ngoặc đơn mở. Trong văn bản Sublime, Tôi đang sử dụng regex sau:Thay thế cho định lượng sở hữu trong python

Article\s[0-9]++(?!\() 

để tìm kiếm các chuỗi sau:

Article 29 
Article 30(1) 

mà không phù hợp với Article 30(1) (như tôi mong đợi nó) nhưng Article 29Article 1.

Khi cố gắng để làm điều tương tự bằng Python (3) sử dụng

import re 
article_list = re.findall(r'Article\s[0-9]++(?!\()', "Article 30(1)") 

tôi nhận được một Lỗi sau khi tôi đang sử dụng một (lồng) quantifier sở hữu mà không được hỗ trợ bởi Python regex. Có cách nào để phù hợp với những gì tôi muốn nó (không) để phù hợp trong Python?

Trả lời

3

Python re không hỗ trợ định lượng sở hữu. Bạn có thể cân nhắc sử dụng Python PyPi regex module để hỗ trợ loại định lượng này. Hoặc sử dụng các công việc sau đây.

Bạn cần phải hoặc thêm một chữ số vào lookahead:

Article\s[0-9]+(?![(0-9]) 
        ^^^ 

Xem this regex demo.

Ngoài ra, sử dụng một ranh giới từ:

Article\s[0-9]+\b(?!\() 
       ^

Xem this regex demo.

2

Bạn cũng có thể bắt chước một nhóm nguyên tử (?>...) xung quanh những gì bạn muốn kết hợp, sử dụng (?=(...))\1 workaround:

(?=(Article\s[0-9]+))\1(?!\() 

(một lookahead cư xử một cách tự nhiên như một một nhóm nguyên tử, tất cả bạn cần là một ảnh chụp và một backreference)

+0

Tôi không thấy bất kỳ lý do nào để từ chối câu trả lời này ... –

Các vấn đề liên quan