2013-02-04 41 views
18

Tôi có một chút nhầm lẫn về chuỗi thô Python. Tôi biết rằng nếu chúng ta sử dụng chuỗi thô, thì nó sẽ coi '\' là dấu gạch chéo ngược thông thường (ví dụ: r '\ n' sẽ là '\' và 'n'). Tuy nhiên, tôi đã tự hỏi những gì nếu tôi muốn phù hợp với một nhân vật dòng mới trong chuỗi thô. Tôi đã thử r '\ n', nhưng nó không hoạt động. Bất cứ ai có một số ý tưởng tốt về điều này?Làm thế nào để phù hợp với một ký tự dòng mới trong chuỗi thô Python

+0

Những loại trận đấu chúng ta đang nói về đây? Bạn đang nói về một biểu thức chính quy, hoặc đơn giản là 'if ... trong my_raw_string'? – mgilson

+0

Xin lỗi vì đã làm bạn bối rối. Tôi đang nói về một biểu thức chính quy. – wei

Trả lời

17

Trong một biểu thức chính quy, bạn cần phải xác định rằng bạn đang ở chế độ multiline:

>>> import re 
>>> s = """cat 
... dog""" 
>>> 
>>> re.match(r'cat\ndog',s,re.M) 
<_sre.SRE_Match object at 0xcb7c8> 

ý rằng re dịch các (string thô) \n thành xuống dòng. Như bạn đã nêu trong bình luận của bạn, bạn không thực sự cần re.M cho nó để phù hợp, nhưng nó giúp phù hợp với $^ bằng trực giác hơn:

>> re.match(r'^cat\ndog',s).group(0) 
'cat\ndog' 
>>> re.match(r'^cat$\ndog',s).group(0) #doesn't match 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'group' 
>>> re.match(r'^cat$\ndog',s,re.M).group(0) #matches. 
'cat\ndog' 
+0

Cảm ơn câu trả lời của bạn @mgilson! Tôi cũng muốn biết lý do tại sao chúng ta cần phải xác định chế độ multiline. Tôi đã thử kết hợp mà không có nó, như thế này "re.match (r'cat \ ndog ', s)" và nó vẫn hoạt động. – wei

+0

@ user1783403 - Bạn chính xác. Tôi nên đọc thêm tài liệu. chỉ định 're.M' lấy'^'và' $ 'để khớp trực quan hơn. – mgilson

+0

Bất kỳ cách nào để nhận '$' để khớp "ít trực giác" - tức là chỉ khớp * * ở cuối chuỗi? Tôi không muốn nó khớp trước khi '\ n' –

4

Câu trả lời đơn giản nhất là không sử dụng chuỗi thô. Bạn có thể thoát khỏi các dấu gạch chéo ngược bằng cách sử dụng \\.

Nếu bạn có số lượng lớn các dấu xồ nguợc ở một số phân khúc, sau đó bạn có thể nối dây thô và chuỗi bình thường khi cần thiết:

r"some string \ with \ backslashes" "\n" 

(Python tự động móc nối xâu chỉ có khoảng trắng giữa chúng.)

Hãy nhớ rằng nếu bạn đang làm việc với các đường dẫn trên Windows, tùy chọn dễ nhất là chỉ sử dụng các dấu gạch chéo ở phía trước - nó sẽ vẫn hoạt động tốt.

+0

@mgilson Tôi chỉ kiểm tra xem nó có hoạt động với chuỗi thô và dây bình thường không, vì nó không phải là thứ tôi đã làm. Đã chỉnh sửa như vậy. Nó thực sự tốt hơn một chút khi tôi tin rằng việc ghép nối được thực hiện tại thời gian phân tích cú pháp, thay vì khi nó được thực thi. –

+0

Vâng, tôi chưa bao giờ thực sự kiểm tra trước đây :) :) – mgilson

+0

Tại sao -1 về điều này? –

0
def clean_with_puncutation(text):  
    from string import punctuation 
    import re 
    punctuation_token={p:'<PUNC_'+p+'>' for p in punctuation} 
    punctuation_token['<br/>']="<TOKEN_BL>" 
    punctuation_token['\n']="<TOKEN_NL>" 
    punctuation_token['<EOF>']='<TOKEN_EOF>' 
    punctuation_token['<SOF>']='<TOKEN_SOF>' 
    #punctuation_token 



    regex = r"(<br/>)|(<EOF>)|(<SOF>)|[\n\!\@\#\$\%\^\&\*\(\)\[\]\ 
      {\}\;\:\,\.\/\?\|\`\_\\+\\\=\~\-\<\>]" 

###Always put new sequence token at front to avoid overlapping results 
#text = '<EOF>[email protected]#$%^&*()[]{};:,./<>?\|`~-= _+\<br/>\n <SOF>\ ' 
    text_="" 

    matches = re.finditer(regex, text) 

    index=0 

    for match in matches: 
    #print(match.group()) 
    #print(punctuation_token[match.group()]) 
    #print ("Match at index: %s, %s" % (match.start(), match.end())) 
     text_=text_+ text[index:match.start()] +" " 
       +punctuation_token[match.group()]+ " " 
     index=match.end() 
    return text_ 
Các vấn đề liên quan