正则表达式 - 捕获标点符号和收缩

时间:2015-11-01 16:10:55

标签: python regex punctuation

我是regex的新手,我正在尝试编写一个函数来将字符串分解为其收缩和标点符号。

例如:I'm feeling sad today.

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

到目前为止,我只能使用([a-zA-Z])\w*过滤字母,而我不知道如何过滤此字母以包含标点符号。

2 个答案:

答案 0 :(得分:2)

import re

st = "I'm feeling sad today."

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

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

答案 1 :(得分: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等非标准收缩。