Trochę zagubiłem się o surowy ciąg znaków Python. Wiem, że jeśli użyjemy nieprzetworzonego łańcucha, to będzie traktować "\" jako normalny ukośnik odwrotny (np. R \ n "będzie" \ "i" n "). Zastanawiałem się jednak, co zrobić, jeśli chcę dopasować nowy ciąg znaków do surowego ciągu znaków. Próbowałem r \ n ", ale to nie zadziałało. Ktoś ma jakieś dobre pojęcie na ten temat?Jak dopasować znak nowego wiersza w nieprzetworzonym łańcuchu Python
Odpowiedz
w wyrażeniu regularnym, trzeba określić, że jesteś w trybie wielowierszowego:
>>> import re
>>> s = """cat
... dog"""
>>>
>>> re.match(r'cat\ndog',s,re.M)
<_sre.SRE_Match object at 0xcb7c8>
Uwaga, re
tłumaczy \n
(surowy ciąg) do nowej linii. Jak wskazano w komentarzach, nie faktycznie potrzebare.M
na to, aby dopasować, ale to nie pomaga z pasującymi $
i ^
bardziej intuicyjnie:
>> 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'
Dzięki za odpowiedź @mgilson! Chciałbym również wiedzieć, dlaczego musimy określić tryb multilinii. Próbowałem dopasowywania bez niego, jak ten "re.match (r'cat \ ndog", s) "i nadal działa. – wei
@ user1783403 - Masz rację. Więcej powinienem przeczytać w dokumentacji. określenie 're.M' pobiera'^'i' $ ', aby dopasować bardziej intuicyjnie. – mgilson
Jakikolwiek sposób, aby '$' dopasować "mniej intuicyjnie" - tj. Aby dopasować * tylko * na końcu łańcucha? Nie chcę, żeby to się zgadzało przed '\ n' –
Najprostsza odpowiedź to po prostu nie używać nieprzetworzonego łańcucha. Możesz uciec przed ukośnikami, używając \\
.
Jeśli masz ogromną liczbę ukośniki w niektórych segmentach, a następnie można łączyć surowe ciągi i normalne ciągi jako potrzebne:
r"some string \ with \ backslashes" "\n"
(Python automatycznie skleja literały ciągów tylko z odstępami między nimi.)
Pamiętaj, że jeśli pracujesz z ścieżkami w systemie Windows, najprościej jest po prostu użyć ukośników - nadal będzie działać poprawnie.
@mgilson Właśnie sprawdzałem, czy działa z nieprzetworzonymi łańcuchami i normalnymi ciągami, ponieważ to nie jest coś, co zrobiłem. Edytowane tak jak to. Jest to trochę lepsze, ponieważ uważam, że konkatenacja odbywa się w czasie parsowania, a nie wtedy, gdy jest wykonywana. –
Tak, nigdy wcześniej nie sprawdzałem :) – mgilson
Dlaczego -1 na tym? –
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_
- 1. Znak nowego wiersza w C#
- 2. Usunięcie znak nowego wiersza na końcu pliku
- 3. Jak ustawić warunkowy znak nowego wiersza w PS1?
- 4. Jak mogę napisać znak nowego wiersza w ColdFusion?
- 5. Jak sprawdzić, czy znak w łańcuchu jest literą? Python
- 6. Jak napisać natywny znak nowego wiersza do deskryptora pliku w języku Python?
- 7. Regex, jak dopasować opcjonalny znak
- 8. Jak korzystać z nowego wiersza w ToolTip
- 9. python regex: aby dopasować znak spacji lub koniec łańcucha
- 10. Zamień znak "/" przedniej kreski w łańcuchu JavaScript?
- 11. sed/regex: Jak dopasować "<' or '>" w łańcuchu znaków
- 12. antlr dowolny znak z wyjątkiem
- 13. Zastąpić nowego wiersza pytona
- 14. Jak wstawić znak nowego wiersza po ustalonej liczbie znaków w pliku
- 15. Regex zamień wszystkie znaki nowego wiersza przecinkiem
- 16. Znajdowanie podwójnych spacji w łańcuchu znaków - Python
- 17. Jak mogę dopasować znak nowej linii w grok/logstash?
- 18. Jak dopasować znak zapytania "?" jako regexp w lokalizacji nginx.conf
- 19. Jak zamienić ï ¿½ w łańcuchu
- 20. Dodawanie nowego wiersza z PHPExcel?
- 21. jak odszyfrować znak non-unicode w python?
- 22. uporządkuj kolejność bajtów w łańcuchu szesnastkowym (python)
- 23. iconv(): Wykryto niekompletny znak wielobajtowy w łańcuchu wejściowym
- 24. Dodawanie nowego wiersza/znacznika break w XML
- 25. WYMIANA znaku nowego wiersza w MYSQL nie działa
- 26. Jak interpolować listę w łańcuchu znaków w języku Python?
- 27. Wyrażenie regularne: jak dopasować ciąg zawierający "\ n" (znak nowej linii)?
- 28. Co oznacza znak $ {} (znak dolara i nawiasy klamrowe) w łańcuchu w języku JavaScript?
- 29. Jak wymusić podział wiersza na połączonym łańcuchu JavaScript?
- 30. usunąć znaki nowego wiersza z pliku txt za pomocą php
Jakie meczu mówimy tutaj? Czy mówisz o dopasowaniu do wyrażenia regularnego lub po prostu 'if ... in my_raw_string'? – mgilson
Przepraszam, że wprowadzam Cię w błąd. Mówię o regularnym wyrażeniu. – wei