2015-03-26 5 views
1

У меня есть тоны строковых данных и вы хотите найти все «iphone case» или «iPhone 6 case» или «iphone cases» в строке и удалить с помощью regexp.python regex два слова

tweet=re.sub(r'iphone\s[case]+', 'DELETESENTENCE', tweet) 
tweet=re.sub(r'[iphone\s]+[0-6]+[\scase]+', 'DELETESENTENCE', tweet) 

Я использовал для регулярного выражения выше, а потом я убью весь текст, включая DELETESENTENCE.

Но мне просто интересно, более достойный способ очистки текста, а не убийство по отдельности или замене шаблона индивидуально

, например, у меня есть lst=['iPhone case', 'iPhone battery', 'iPhone film']

и re(r'lst','DELETESENTENCE','tweet) < == очевидно, что это не работает.

+0

Что ваш вопрос? Ваш код работает, не так ли? Почему вы хотите изменить его? Если мы сможем понять вашу мотивацию, мы можем лучше понять, какой совет предложить :) –

+0

@MagnusHoff Мой вопрос: «Есть ли способ, чтобы я мог объединить эти два регулярных выражения?» И если у меня есть список из двух слов, как описано выше, как я могу убить их с помощью регулярного выражения? –

+0

А, спасибо. Ответы ниже кажутся правильными. В общем случае вы можете комбинировать регулярные выражения с оператором * или *, '|'. Например, если вы хотите сопоставлять «exp 1» и «exp 2», вы можете комбинировать их следующим образом: '(exp 1) | (exp 2)'. –

ответ

2

Регулярное выражение может быть соединено «или» с колонкой «|» персонаж. Это должно работать в вашем случае:

tweet=re.sub('|'.join(lst), 'DELETESENTENCE', tweet) 
2

Не уверен, что я хорошо понимаю, но это то, что делает то, что вы хотите:

'iphone(?:\s+[0-6])?\s+cases?' 

Это будет соответствовать:

iphone case 
iPhone 6 case 
iphone cases 
2

Прямо сейчас, у вас есть какие-то проблемы в регулярных выражений. [case]+ означает «любые символы« c »,« a »,« s »,« e »1 или более раз», я думаю, это не то, что вы хотите.

Если вы хотите, чтобы просто быть в состоянии соответствовать 2 слова «iPhone» и «случай», вы можете использовать:

tweet=re.sub(r'(?i)\b(?:iphone|case)\b', 'DELETESENTENCE', tweet) 

Если вам просто нужно удалить 2 слова, которые разделены с номером, затем

tweet=re.sub(r'(?i)\biphone\s+[0-9]+\s+case\b', 'DELETESENTENCE', tweet) 
1

Вы хотите, чтобы соответствовать «айфона», с последующим необязательным «6», а затем «дело» или «случаях» (это также соответствует «iphone 6 случай сек ", но я предполагаю, что вы не против).

Вместо того, чтобы редактировать строку, а затем удалить, вы можете сделать это следующим образом (карусель!):

for tweet in tweets: 
    if re.search(r"iphone\s+(6\s+)?cases?", tweet, re.IGNORECASE): 
     <delete or mark message for deletion> 

Или в один шаг:

filtered_tweets = [ tweet for tweet in tweets if not 
    re.search(r"iphone\s+(6\s+)?cases?", tweet, re.IGNORECASE) ] 
Смежные вопросы