我正在开发一个函数,它保留一个单词内的符号(一个单词可以包含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())
- 这样也删除了单词中的标点符号
答案 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。 (不要忘记i
和g
标志。
[编辑] 您还希望匹配单词外的_
好的,如果您希望匹配下划线也按原样更新:(?<![a-z_])[a-z_][^\s]*[a-z_](?![a-z_])|(?<= )[a-z_](?= )
。