Как сопоставить новый символ строки в исходной строке Python - программирование
Подтвердить что ты не робот

Как сопоставить новый символ строки в исходной строке Python

Я немного смутился о необработанной строке Python. Я знаю, что если мы используем сырую строку, тогда она будет рассматривать "\" как нормальную обратную косую черту (например, r '\n' будет '\' и 'n'). Тем не менее, мне было интересно, что, если я хочу совместить новый символ строки в необработанной строке. Я попробовал r '\n', но это не сработало. У кого-нибудь есть хорошая идея об этом?

4b9b3361

Ответ 1

В регулярном выражении вам нужно указать, что вы находитесь в многострочном режиме:

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

Обратите внимание, что re переводит \n (необработанная строка) в новую строку. Как вы указали в своих комментариях, вам действительно не нужно re.M, но это помогает с совпадением $ и ^ более интуитивно:

>> 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'

Ответ 2

Самый простой ответ - просто не использовать необработанную строку. Вы можете избежать обратной косой черты с помощью \\.

Если у вас есть огромное количество обратных косых черт в некоторых сегментах, тогда вы можете связать необработанные строки и обычные строки по мере необходимости:

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

(Python автоматически объединяет строковые литералы с пробелом между ними.)

Помните, что если вы работаете с путями в Windows, самый простой вариант - просто использовать косые черты - он все равно будет работать нормально.

Ответ 3

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_