Подтвердить что ты не робот

Python: удалить слова между двумя разделителями

У меня есть шумные данные.. что-то вроде

<@ """@$ FSDF >something something <more noise>

теперь я просто хочу извлечь "что-то". Есть ли способ удалить текст между этими двумя метриками "<" и " > "

Спасибо

4b9b3361

Ответ 1

Используйте регулярные выражения:

>>> import re
>>> s = '<@ """@$ FSDF >something something <more noise>'
>>> re.sub('<[^>]+>', '', s)
'something something '

[Обновление]

Если вы попробовали шаблон типа <.+>, где точка означает, что любой символ и знак плюса означает один или несколько, вы знаете, что это не работает.

>>> re.sub(r'<.+>', s, '')
''

Почему!?! Это происходит потому, что регулярные выражения по умолчанию являются "жадными". Выражение будет соответствовать чему угодно до конца строки, включая > - и это не то, что мы хотим. Мы хотим совместить < и останавливаться на следующем >, поэтому мы используем шаблон [^x], который означает "любой символ, но x" (x является >).

Оператор ? поворачивает совпадение "не жадный", поэтому он имеет тот же эффект:

>>> re.sub(r'<.+?>', '', s)
'something something '

Предыдущее является более явным, это меньше печатает; что x? означает ноль или одно вхождение x.

Ответ 2

Конечно, вы можете использовать регулярные выражения.

import re
s = #your string here
t = re.sub('<.*?>', '', s)

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

Ответ 3

import re
my_str = '<@ """@$ FSDF >something something <more noise>'
re.sub('<.*?>', '', my_str)
'something something '

Функция re.sub принимает регулярное выражение и заменяет все совпадения в строке вторым параметром. В этом случае мы ищем все символы между < и > ('<.*?>') и заменяя их ничем ('').

? используется в re для не жадных поисков.

Подробнее о re module.


Если эти "шумы" на самом деле являются html-тегами, я предлагаю вам изучить BeautifulSoup

Ответ 4

Сначала спасибо Пауло Скардин, я использовал твою речку, чтобы сделать отличную вещь. Идея заключалась в том, чтобы иметь свободный текст LibreOffice po для печати. И я сделал следующее script, которое очистит файл справки для более мелких и простых.

import re
f = open('a.csv')
text = f.read()
f.close()

clean = re.sub('<[^>]+>', ' ', text)

f = open('b.csv', 'w')
f.write(clean)
f.close()

Ответ 5

Просто для интереса вы можете написать код, например:

with open('blah.txt','w') as f:
    f.write("""<sdgsa>one<as<>asfd<asdf>
<asdf>two<asjkdgai><iasj>three<fasdlojk>""")

def filter_line(line):
    count=0
    ignore=False
    result=[]
    for c in line:
        if c==">" and count==1:
            count=0
            ignore=False
        if not ignore:
            result.append(c)
        if c=="<" and count==0:
            ignore=True
            count=1
    return "".join(result)

with open('blah.txt') as f:
    print "".join(map(filter_line,f.readlines()))

>>> 
<>one<>asfd<>
<>two<><>three<>