У меня есть шумные данные.. что-то вроде
<@ """@$ FSDF >something something <more noise>
теперь я просто хочу извлечь "что-то". Есть ли способ удалить текст между этими двумя метриками "<" и " > "
Спасибо
У меня есть шумные данные.. что-то вроде
<@ """@$ FSDF >something something <more noise>
теперь я просто хочу извлечь "что-то". Есть ли способ удалить текст между этими двумя метриками "<" и " > "
Спасибо
Используйте регулярные выражения:
>>> 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.
Конечно, вы можете использовать регулярные выражения.
import re
s = #your string here
t = re.sub('<.*?>', '', s)
Этот код должен сделать это.
import re
my_str = '<@ """@$ FSDF >something something <more noise>'
re.sub('<.*?>', '', my_str)
'something something '
Функция re.sub
принимает регулярное выражение и заменяет все совпадения в строке вторым параметром. В этом случае мы ищем все символы между <
и >
('<.*?>'
) и заменяя их ничем (''
).
?
используется в re
для не жадных поисков.
Подробнее о re module.
Если эти "шумы" на самом деле являются html-тегами, я предлагаю вам изучить BeautifulSoup
Сначала спасибо Пауло Скардин, я использовал твою речку, чтобы сделать отличную вещь. Идея заключалась в том, чтобы иметь свободный текст 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()
Просто для интереса вы можете написать код, например:
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<>