在字符串中剥离符号的替代方法

时间:2016-10-21 04:20:24

标签: python regex

我正在开发一个函数,它保留一个单词内的符号(一个单词可以包含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())

我知道这不是最好的,最佳的方式!!有没有人推荐我可以尝试的任何替代方案?可能是regEx来做这个?

  • 我尝试过使用: 消极的环顾四周,看看背后:\W+(?!\S*[a-z])|(?<!\S)\W+

  • s.strip(punctuation)

  • re.sub('[^\w]', ' ', doc.strip(' ').lower()) - 这样也删除了单词中的标点符号

1 个答案:

答案 0 :(得分:1)

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

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

[编辑] 在您的评论之后。

好的,我误解了你的问题。

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

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

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

[编辑] 您还希望匹配单词外的_

好的,如果您希望匹配下划线也按原样更新:(?<![a-z_])[a-z_][^\s]*[a-z_](?![a-z_])|(?<= )[a-z_](?= )

在此处查看:https://regex101.com/r/EAEelq/4