2012-07-04 30 views
9

Tôi có một chuỗi một cái gì đó như thế nàyMột regex để phát hiện chuỗi không kèm theo trong dấu ngoặc kép

"quick" "brown" fox jumps "over" "the" lazy dog

Tôi cần một regex để phát hiện những lời không kèm theo trong dấu ngoặc kép. Sau một số lần thử ngẫu nhiên, tôi tìm thấy số này ("([^"]+)"). Điều này phát hiện một chuỗi kèm theo trong dấu ngoặc kép. Nhưng tôi muốn ngược lại. Tôi thực sự không thể đến với nó ngay cả sau khi cố gắng đảo ngược regex được đề cập ở trên. Tôi khá yếu trong regex. Xin hãy giúp tôi

+1

bạn có thể phù hợp với tất cả các chuỗi, rằng một trích dẫn với '" 'và thêm 'NOT' cho bộ lọc này :) – gaussblurinc

+1

vì vậy bạn có muốn điều này grab 'fox jumps lazy dog'? – jared

+1

@jared: có cùng – Shades88

Trả lời

26

Sử dụng lookahead/lookbehind khẳng định:

(?<![\S"])([^"\s]+)(?![\S"]) 

Ví dụ:

>>> import re 
>>> a='"quick" "brown" fox jumps "over" "the" lazy dog' 
>>> print re.findall('(?<![\S"])([^"\s]+)(?![\S"])',a) 
['fox', 'jumps', 'lazy', 'dog'] 

Điều quan trọng ở đây là lookahead/lookbehind khẳng định. Bạn có thể nói: Tôi muốn biểu tượng này trước biểu thức nhưng tôi không muốn nó là một phần của trận đấu. Được. Cho rằng bạn sử dụng khẳng định:

(?<![\S"])abc 

Đó là một tiêu cực lookbehind. Điều đó có nghĩa là bạn muốn abc nhưng không có [\S"]trước điều đó có nghĩa là không được có ký tự không dấu cách (đầu từ) hoặc " trước đó.

Đó là giống nhau nhưng theo một hướng khác:

abc(?![\S"]) 

Đó là một tiêu cực lookahead. Điều đó có nghĩa là bạn muốn abc nhưng không có [\S"]sau.

Có bốn khẳng định differenet loại nói chung:

(?=pattern) 
    is a positive look-ahead assertion 
(?!pattern) 
    is a negative look-ahead assertion 
(?<=pattern) 
    is a positive look-behind assertion 
(?<!pattern) 
    is a negative look-behind assertion 
+1

cảm ơn rất nhiều, nó hoạt động giống như ma thuật :) Chỉ cần thêm một ưu tiên nữa, bạn có thể giải thích nó một chút không? Có vẻ hơi phức tạp một chút – Shades88

+1

@ Shades88: no t ở tất cả :) –

+1

c'mon ... bạn biết loại của họ là 'lookahead/lookbehind assertions'. bạn chắc chắn có thể giải thích cho tôi như thế nào đó là làm việc !! – Shades88

0

Tháo quote đầu tiên kể từ chuỗi

0

sử dụng regex này:

\s+(?<myword>([^\"\s]+)*)\s+ 

này nên làm việc; và nhận nhóm có tên myword. khác bạn cần phải cắt chuỗi kết quả của bạn.

+0

sẽ không làm việc cho các từ chỉ với một khoảng trống giữa: 'fox jumps' chẳng hạn –

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