2016-10-21 125 views
0

我正在研究一个保留一个单词(一个单词可以包含a-zA-Z,0-9和_)的符号的函数,但是除去每个其他符号去掉一个字符串中符号的替代方法

For example: 
Input String - hell_o ? my name _ i's <hel'lo/> 
Output - ['hell_o' ,'my', 'name', '_', "i's" ,'hel'lo'] 

我使用的功能:单词外

l = ' '.join(filter(None,(word.strip(punctuation.replace("_","")) for word in input_String.split()))) 
l = re.sub(r'\s+'," ",l) 
t = str.split(l.lower()) 

我知道这是不是最好的,最佳的方式!没有人建议我可以尝试?也许正则表达式的任何替代方案去做这个??

  • 我试着使用: 负环顾四周,看看屁股:\W+(?!\S*[a-z])|(?<!\S)\W+

  • s.strip(punctuation)

  • re.sub('[^\w]', ' ', doc.strip(' ').lower()) - 这消除了字里面标点符号太

+2

如果你* *知道这是不是'''最好的,optimal'''的方式,那么你心里一定有一些替代品 - 请列出那些(在这个问题)以及你拒绝他们的原因,所以我们知道什么不能工作。 – wwii

回答

1

可以匹配任何不同于a-zA-Z, 0-9 and _的字符都与您相同提及2个字母与(?<=[a-z])\W(?=[a-z])之间,并将其替换为无,将其删除。

最后你会有一个非常危险的算法,例如在句子I'm fine.And you?,如果没有空格后,它会在I'm fineAnd you?,这可能不是你想要的。


[编辑]您的意见后。

好吧我误解了你的问题。

(?<![a-z])[a-z][^\s]*[a-z](?![a-z])

现在我要选择'hell_o' ,'my', 'name', "i's" ,'hel'lo'一个正则表达式来了一起。

你可以看到它在这里工作:https://regex101.com/r/EAEelq/3。 (不要忘记ig标志)。


[编辑]正如你也想在_匹配一个单词

OK之外,所以如果你想也匹配下划线更新的是:(?<![a-z_])[a-z_][^\s]*[a-z_](?![a-z_])|(?<=)[a-z_](?=)

看到它在这里工作:https://regex101.com/r/EAEelq/4

+0

是啊!!感谢您的建议!!但是这个正则表达式并没有解决这个问题!!我尝试了几个例子!!但是并没有像预期的那样工作。例如:输入字符串是“你好!不要d ??? o

+0

我的意思是如果regEx是比我已经做的更好的方法! –

+1

我在你的评论后编辑我的回复,请检查它是否是你想要的! – antoni