2015-11-01 79 views
1

我是新来的正则表达式,我正在尝试编写一个函数来将字符串分解为它的收缩和标点符号。正则表达式捕获标点符号和收缩

例如:I'm feeling sad today.

应该返回一个列表:["I","'m","feeling","sad","today","."]

到目前为止,我只能过滤与([a-zA-Z])\w*的字母,我不知道如何过滤这包括标点符号。

+0

那么'感觉'呢? – Kasramvd

+0

我编辑了 – NeptuneGamer

回答

2
import re 

st = "I'm feeling sad today." 

li = re.findall(r'\w+|[;.,!?:]|\'\w+',st) 

['I', "'m", 'feeling', 'sad', 'today', '.'] 
+0

有没有办法用findall来做? – NeptuneGamer

+0

@NeptuneGamer,是的,我已经更新了re.findall。 – LetzerWille

+0

这是几乎那里,但是'与连接m – NeptuneGamer

0

你需要搜索的字符它们要么只字字符的运行,或者两者都不是字字符也不空白:

>>> s = "I'm feeling sad today." 
>>> rgx = re.compile(r'(\w+|[^\w\s]+)') 
>>> rgx.findall(s) 
['I', "'", 'm', 'feeling', 'sad', 'today', '.'] 

编辑

为了捕捉收缩,正则表达式需要更复杂。它必须使用后退断言来检查撇号是否由一个单词字符(否则它将错误地匹配引用的单词)前缀。这里有一个基本的解决方案:

>>> s = "I'm feeling 'sad' today." 
>>> rgx = re.compile(r"((?<=\w)'\w+|\w+|[^\w\s]+)") 
>>> rgx.findall(s) 
['I', "'m", 'feeling', "'", 'sad', "'", 'today', '.'] 

虽然有一些边缘情况,这不能处理。例如,有一些音译的外来词(例如Qur'an)包含嵌入的撇号。当然,还有像O'Connor这样的名字和O'Connor's之类的所有格,以及His 'n' Hers这样的非标准收缩。

+0

我意识到它可能不明确的问题,但撇号加入到字母('米),这是证明难以产生 – NeptuneGamer

+0

@NeptuneGamer。我已经用一个改进的解决方案更新了我的答案,这个解决方案很有希望。 – ekhumoro