我有字符串数据的音调,想要在字符串中找到所有“iphone case”或“iPhone 6 case”或“iphone cases”,并使用regexp删除。
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 :(得分:2)
不确定我是否理解,但这是否符合您的要求:
'iphone(?:\s+[0-6])?\s+cases?'
这将匹配:
iphone case
iPhone 6 case
iphone cases
答案 1 :(得分:2)
目前,你在正则表达式中存在一些问题。 [case]+
表示“任何”c“,”a“,”s“,”e“字符1次或更多次”,我想这不是你想要的。
如果你想只能匹配2个单词“iphone”和“case”,你可以使用:
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)
答案 2 :(得分:2)
正则表达式可以加入"或"列#34; |"字符。 这应该适合你的情况:
tweet=re.sub('|'.join(lst), 'DELETESENTENCE', tweet)
答案 3 :(得分:1)
您希望匹配" IPhone",然后是可选的" 6",然后是" case"或"案例" (这也符合" iphone 6案例 s ",但我认为你不介意。)
而不是编辑字符串然后删除(环形交叉!),你可以这样做:
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) ]