Вопрос-Ответ

How to input a regex in string.replace?

Как ввести регулярное выражение в string.replace?

Мне нужна помощь по объявлению регулярного выражения. Мои входные данные выглядят следующим образом:

this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>. 
and there are many other lines in the txt files
with<[3> such tags </[3>

Требуемый результат:

this is a paragraph with in between and then there are cases ... where the number ranges from 1-100. 
and there are many other lines in the txt files
with such tags

Я пробовал это:

#!/usr/bin/python
import os, sys, re, glob
for infile in glob.glob(os.path.join(os.getcwd(), '*.txt')):
for line in reader:
line2 = line.replace('<[1> ', '')
line = line2.replace('</[1> ', '')
line2 = line.replace('<[1>', '')
line = line2.replace('</[1>', '')

print line

Я тоже пробовал это (но, похоже, я использую неправильный синтаксис регулярных выражений):

        line2 = line.replace('<[*> ', '')
line = line2.replace('</[*> ', '')
line2 = line.replace('<[*>', '')
line = line2.replace('</[*>', '')

Я не хочу жестко кодировать replace от 1 до 99.

Переведено автоматически
Ответ 1

Этот протестированный фрагмент должен это сделать:

import re
line = re.sub(r"</?\[\d+>", "", line)

Редактировать: Вот прокомментированная версия, объясняющая, как это работает:

line = re.sub(r"""
(?x) # Use free-spacing mode.
< # Match a literal '<'
/? # Optionally match a '/'
\[ # Match a literal '['
\d+ # Match one or more digits
> # Match a literal '>'
"""
, "", line)

Регулярные выражения - это весело! Но я бы настоятельно рекомендовал потратить час или два на изучение основ. Для начала вам нужно узнать, какие символы являются особыми: "метасимволы", которые нужно экранировать (т. Е. С обратной косой чертой, помещенной впереди - и правила различаются внутри и вне классов символов.) Есть отличный онлайн-учебник по адресу: www.regular-expressions.info. Время, которое вы потратите на это, окупится многократно. Удачного регулярного выражения!

Ответ 2

str.replace() выполняет фиксированные замены. Используйте re.sub() вместо этого.

Ответ 3

I would go like this (regex explained in comments):

import re

# If you need to use the regex more than once it is suggested to compile it.
pattern = re.compile(r"</{0,}\[\d+>")

# <\/{0,}\[\d+>
#
# Match the character “<” literally «<»
# Match the character “/” literally «\/{0,}»
# Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «{0,}»
# Match the character “[” literally «\[»
# Match a single digit 0..9 «\d+»
# Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
# Match the character “>” literally «>»

subject = """this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>.
and there are many other lines in the txt files
with<[3> such tags </[3>"""


result = pattern.sub("", subject)

print(result)

If you want to learn more about regex I recomend to read Regular Expressions Cookbook by Jan Goyvaerts and Steven Levithan.

Ответ 4

The easiest way

import re

txt='this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>. and there are many other lines in the txt files with<[3> such tags </[3>'

out = re.sub("(<[^>]+>)", '', txt)
print out
python regex string