Python регулярное выражение, удаляющее пространство в скобках - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь удалить пробелы, окружающие символы внутри квадратных скобок, и оставить только 1 пробел за пределами квадратных скобок, если следующий токен является непробельным символом. Например, banana [ pasta pause] [12 haha] [author bird] tree [red] abc [blue] будет banana[pastapause][12haha][authorbird] tree[red] abc[blue]

Неважно, есть ли пробел / ведущий или куда пробел идет влево / вправо. До сих пор я получил площадь в квадрате вниз. Это мой код для удаления пробелов внутри:

cleaned_texts = []
p = re.compile("\[(\s*?.*?\s*?)\]")
matches = p.findall(orig_text)
for match in matches:
    cleaned = re.sub("\s","",match)
    cleaned_texts.append(cleaned)

text = orig_text
for i in range(len(matches)):
    cleaned = re.sub(matches[i],cleaned_texts[i],text)
    text = cleaned

Для добавления одного пробела снаружи, если он имеет форму w[]w с символом w, не является пробелом, я получил очень уродливую версию, и у нее все еще есть некоторые угловые случаи. Я не уверен, как это сделать эффективно.

#find 2 spaces or leading and trailing space
p = re.compile("\s(\[.*?\])\s|\s(\[.*?\])$|^\s?(\[.*?\])\s?")
temp = p.sub(r"\1"," "+cleaned)

#find [] with form a[]b and add a space
p = re.compile("(\S)(\[.*?\])(\S)")
temp_2 = p.sub(r"\1\2"+" "+r"\3",temp)

#find 2 spaces or leading and trailing space one more time
p = re.compile("\s(\[[a-zA-Z-0-9]*?\])\s|^\s?(\[[a-zA-Z-0-9]*?\])\s|\s(\[[a-zA-Z-0-9]*?\])\s?$")
temp_3 = p.sub(" "+r"\1",temp_2)

1 Ответ

1 голос
/ 21 апреля 2020

Обратите внимание, что ожидаемый вывод содержит пробелы только до дерева и ab c, но все остальные пробелы (например, после банан и между ] и [) исчезли.

Это означает, что вы действительно хотите:

  1. Удалить все пробелы в скобках.

  2. Удалите все оставшиеся пробелы (вне скобок), если после них не стоит буква (не символ без пробелов).

Обратите также внимание, что ваш текст содержит «парные» скобки, то есть после [ (и нескольких символов без скобок) появляется ], но не другой [ (я хочу использовать это Feature).

Шаблоны для определения обоих вышеупомянутых случаев:

pat1 = re.compile(r'\s+(?=[^\[]*\])')

  • \s+ - последовательность пробелов,
  • (?=...) - с последующим (положительный прогноз):
    • [^\[]* - возможно, пустая последовательность символов, отличных от [,
    • \] - и закрывающая скобка. * 10 51 *

pat2 = re.compile(r'\s+(?![a-z])', re.I)

  • \s+ - последовательность пробелов,
  • (?![a-z]) - без буквы (отрицательный взгляд), * ​​1064 *
  • re.I - без учета регистра.

Чтобы выполнить пошаговое преобразование, вы можете запустить:

t1 = pat1.sub('', orig_text)
print('step 1:', t1)
t2 = pat2.sub('', t1)
print('step 2:', t2)

получить:

step 1: banana [pastapause] [12haha] [authorbird] tree [red] abc [blue]
step 2: banana[pastapause][12haha][authorbird] tree[red] abc[blue]

Или вы можете сделать целое преобразование в одном go, выполнив:

pat2.sub('', pat1.sub('', orig_text))
...