2011-12-12 42 views
6

Tôi đang cố tạo biểu thức chính quy khớp với cụm từ thông dụng giữa hai dấu gạch chéo tiến. Vấn đề chính của tôi là các biểu thức chính quy có thể chứa các dấu gạch chéo về phía trước, được thoát bằng dấu gạch chéo ngược. Tôi cố gắng lọc chúng ra với một xác nhận lookbehind tiêu cực (chỉ phù hợp với dấu gạch chéo đóng nếu không có phản ứng dữ dội tại vị trí hiện tại), tuy nhiên, bây giờ tôi đang gặp vấn đề mà tôi không nhận được trận đấu, nếu regex chính nó thực sự kết thúc bằng dấu gạch chéo ngược thoát.Cụm từ thông dụng: Chuỗi trận đấu giữa hai dấu gạch chéo nếu chuỗi đó chứa dấu gạch chéo thoát

thử nghiệm chương trình:

#!/usr/bin/python 
import re 
teststrings=[ 
    """/hello world/""", 
    """/string with foreslash here \/ and here\//""", 
    """/this one ends with backlash\\\\/"""] 

patt="""^\/(?P<pattern>.*)(?<!\\\\)\/$""" 

for t in teststrings: 
    m=re.match(patt,t) 
    if m!=None: 
     print t,' => MATCH' 
    else: 
     print t," => NO MATCH" 

đầu ra:

/hello world/ => MATCH 
/string with foreslash here \/ and here\// => MATCH 
/this one ends with backlash\\/ => NO MATCH 

Làm thế nào tôi sẽ sửa đổi khẳng định chỉ đánh nếu có một phản ứng dữ dội duy nhất tại vị trí hiện tại, nhưng không phải là hai?

Hoặc có cách nào tốt hơn để trích xuất regex không? (Lưu ý, trong các tập tin thực tế tôi cố gắng phân tích các dòng chứa nhiều hơn chỉ là regex tôi có thể không chỉ đơn giản là tìm kiếm các dấu gạch chéo đầu tiên và cuối cùng trên mỗi dòng và nhận được tất cả mọi thứ Inbetween..)

+0

Trong ví dụ thực tế của bạn, bạn có thể đã trốn thoát trước/sau là người đầu tiên/cuối cùng "thực" giảm? –

+0

có, chuỗi sau regex có thể có các ký tự tùy ý, bao gồm dấu gạch chéo – Gryphius

Trả lời

16

Hãy thử điều này:

pattern = re.compile(r"^/(?:\\.|[^/\\])*/") 

Giải thích:

^  # Start of string 
/  # Match/
(?:  # Match either... 
\\. # an escaped character 
|  # or 
[^/\\] # any character except slash/backslash 
)*  # any number of times. 
/  # Match/

Đối với ứng dụng "thực tế" của bạn (tìm ra "chuỗi giảm phân định" đầu tiên, bất chấp slashes thoát), tôi muốn sử dụng

pattern = re.compile(r"^(?:\\.|[^/\\])*/((?:\\.|[^/\\])*)/") 

này giúp bạn như sau: slashes

>>> pattern.match("foo /bar/ baz").group(1) 
'bar' 
>>> pattern.match("foo /bar\/bam/ baz").group(1) 
'bar\\/bam' 
>>> pattern.match("foo /bar/bam/ baz").group(1) 
'bar' 
>>> pattern.match("foo\/oof /bar\/bam/ baz").group(1) 
'bar\\/bam' 
+2

Tôi nghĩ bạn cần '\\.' Để khớp với ký tự thoát. – interjay

+0

Rất tiếc. Vâng cảm ơn. Sẽ chỉnh sửa ... –

+0

hoàn hảo! cảm ơn rất nhiều! – Gryphius

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