Regex проблема с конкретной строкой в ​​Python - PullRequest
0 голосов
/ 08 марта 2019

У меня проблема с регулярным выражением в python. У меня есть строка:

'Aaa Bbb', 'AaaBbbCcc' ,'OneTwost.Three'

И я хочу получить:

`'Aaa Bbb', 'Aaa Bbb Ccc'` 
and 'One Two st.Three' or 'One Two st. Three'

Как правило, мне нужно вставлять пробел перед каждой заглавной буквой (если перед заглавной буквой есть другой знак, чем пробел) и если в строке есть. (точка), затем вставьте пробел 2 назад.

Я очень новичок в новой библиотеке. Я пытаюсь сделать это, основываясь на нескольких темах в стеке о регулярных выражениях, но я не понимаю этого. Кто-нибудь есть идеи, как это сделать?

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Исходя из того, что вы сказали, что хотите, и того, что вы сказали: «У меня есть строка»:

У меня есть строка

'Aaa Bbb', 'AaaBbbCcc',' OneTwost.Three '

Это должно сделать это.

Вход:

>>> import re
>>> string = """'Aaa Bbb', 'AaaBbbCcc' ,'OneTwost.Three'"""

Выход:

>>> re.sub(r'((?<![\',\s])[A-Z]+|[\S]{2}\.)', r' \1', string)
"'Aaa Bbb', 'Aaa Bbb Ccc' ,'One Two st. Three'"

.

Редактировать

Вход (Действует на string и новая переменная string_1, которая удаляет' s)

>>> import re
>>> string = """'Aaa Bbb', 'AaaBbbCcc' ,'OneTwost.Three'"""
>>> string_1 = """Aaa Bbb, AaaBbbCcc ,OneTwost.Three"""

Вывод

>>> re.sub(r'(?<!^)(?<!,)(?<!\s)(?<!\')([A-Z]+|[\S]{2}\.)', r' \1', string)
"'Aaa Bbb', 'Aaa Bbb Ccc' ,'One Two st. Three'"


>>> re.sub(r'(?:(?<!^)(?<!,)(?<!\s)(?<!\'))([A-Z]+|[\S]{2}\.)', r' \1', 
string)
"'Aaa Bbb', 'Aaa Bbb Ccc' ,'One Two st. Three'"


>>> re.sub(r'(?<!^)(?<!,)(?<!\s)(?<!\')([A-Z]+|[\S]{2}\.)', r' \1', string_1)
'Aaa Bbb, Aaa Bbb Ccc ,One Two st. Three'


>>> re.sub(r'(?:(?<!^)(?<!,)(?<!\s)(?<!\'))([A-Z]+|[\S]{2}\.)', r' \1', string_1)
'Aaa Bbb, Aaa Bbb Ccc ,One Two st. Three'

.

Объяснение первого:

  • Сделано в виде строки, как указано в вашей цитате
  • Использование re.sub в этой ситуации с параметром raw_string (r) для печатидинамические / изменяемые / переменные функции захвата и будут возвращать отредактированную строку
  • С первым "(" Я настраиваю его для захвата всего в следующем запросе
  • С "(?<![\',\s])" I 'Я говорю, убедитесь, что то, что следует, что я пытаюсь захватить, не является предварительнымзавершается символом «» или «пробел»
  • С позицией "[A-Z]+" там, где она находится, я говорю захватить любую группу заглавных букв ( НО ПРИМЕЧАНИЕ: Это также будет соответствовать ABC, SDZ, FFRD, ZXF и т. Д., Но не будут захватывать строчные буквы или другие символы )
  • С "|" Я говорю движку «ИЛИ» захватить следующий запрос
  • И с "[\S]{2}\." я говорю «захват», если вы найдете 2 любых «непробельных символа», за которыми следует «.»
  • Финальный ")" завершает директиву группы захвата
  • .
  • Со вторым аргументом "r '\ 1'" я говорю, напечатайте первую группу, которую вы захватили (в этом случае у меня в любом случае только 1 группа захвата) и поместите перед ней один пробел

Редактировать: Небольшое объяснение следующих 2, которые могут действовать на string_1

  • Клянусь, поведение re.sub с поискомпросто вонючийУчитывая ваш комментарий ниже.В каждом из (?<!YOUR_IGNORED_CHARACTER) я говорю re.sub, по сути, не захватывать, если заглавные буквы предшествуют обозначенному символу.(?<!^), однако, означает, что не захватывать, если группа захвата происходит в начале строки.

  • Обратите внимание, что в строке для этого примера я удалил ' из того, что вы дали.

1 голос
/ 08 марта 2019

Вы можете использовать

(?<=\S)(?=[A-Z])|(.{2}\.)

Который необходимо заменить на функцию, см. демонстрацию на regex101.com .


В Python это может быть
import re

data = """
Aaa Bbb
AaaBbbCcc
OneTwost.Three
"""

rx = re.compile(r'(?<=\S)(?=[A-Z])|(.{2}\.)')

def replacer(match):
    if match.group(1):
        return " {} ".format(match.group(1))
    return r' '

data = rx.sub(replacer, data)
print(data)

Что дает

Aaa Bbb
Aaa Bbb Ccc
One Two st. Three
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...