Regex проблема поиска через многострочный скопированный текст Pyperclip - PullRequest
0 голосов
/ 24 сентября 2018

Случается со мной редко, когда я пытаюсь выполнить поиск с помощью регулярного выражения через pyperclip.paste(), если в поисковом выражении используется символ новой строки \n.

Извините, мой английский.

При поиске я делаю это через тройную кавычку, назначенную переменной text:

import re

text = '''
This as the line 1
This as the line 2
'''

pattern = re.compile(r'\d\n\w+')
result = pattern.findall(text)
print(result)

На самом деле она печатает символ новой строки \n.Что я хочу, или почти то, что я ожидаю.

»» »['1 \ nThis']

Но проблема начинается, когда приходит строка для поискаиз текста, скопированного из буфера обмена.

This as the line 1
This as the line 2

Скажем, я просто выбираю и копирую в буфер этот текст, и я хочу, чтобы регулярное выражение извлекало из него тот же предыдущий вывод.На этот раз мне нужно использовать модуль pyperclip.

Итак, подделав предыдущий код и напишите вместо этого:

import re, pyperclip

text = pyperclip.paste()

pattern = re.compile(r'\d\n\w+')
result = pattern.findall(text)
print(result)

Вот результат:

»»» []

Ничего, кроме двух скобок.Я обнаружил (в моей неопытности), что проблема, вызывающая это, является \n символом.И это не имеет никакого отношения к конфликту между питоном (также \ n символом), потому что мы избегаем этого с помощью 'r'.

Я уже нашел не слишком ясное решение для этого (для меня почти, потому чтоя только с основами Python прямо сейчас.)

import re, pyperclip

text = pyperclip.paste()
lines = text.split('\n')
spam = ''

for i in lines:
    spam = spam + i

pattern = re.compile(r'\d\r\w+')
result = pattern.findall(spam)
print(result)

Обратите внимание, что вместо \n для обнаружения новых строк в последнем выражении регулярного выражения, я выбрал \r (\n приведет к тому же плохому поведению при печати только скобок).\r его можно заменить на \s, выход работает, но:

»» »['1 \ rThis']

С \r вместо\n

По крайней мере, это была небольшая победа для меня.

Мне очень поможет, если бы вы могли объяснить мне лучшее решение для этого или почти понять, почему это произошло.Вы также можете порекомендовать некоторые концепции для полного понимания этого.

1 Ответ

0 голосов
/ 24 сентября 2018

Причина, по которой вы получаете \r при вставке, заключается в том, что вы вставляете с компьютера с Windows.На окнах символы новой строки представлены \r\n.Обратите внимание, что \s отличается от \r.\s означает любые пробельные символы.\r - это только символ возврата каретки.

Текст:

This as the line 1 This as the line 2

на самом деле выглядит так:

This as the line 1\r\n This as the line 2\r\n

на машине с Windows.

В регулярном выражении \d\r соответствует концу первой строки: 1\r, но тогда \w+ не соответствует \n.Вам нужно отредактировать ваше первое регулярное выражение:

pattern = re.compile(r'\d\r\n\w+')

Источник: Отличаются ли окончания строк в Windows и Linux?

...