正则表达式将句子分成简单的英语单词

时间:2013-09-24 15:09:50

标签: python regex

我有一个句子,我希望从中提取所有单词。我将一个单词定义为[a-zA-Z],但一个单词可能包含一个撇号。撇号本身不是一个词。我正在用Python3编程。

输入文字:

Don't-thread 0 '' ' 'on \r\nme!

应该给:

Don't
thread
on 
me 

关于正则表达式分裂。然后我将使用python翻译如下:

Don't -> dont 
thread -> thread
on -> on
me -> me

更多输入:

   ''Kay', he said. 'What're you goin' to do?'

正则表达式拆分和python翻译应该给出:

   ''Kay' -> kay 
   he -> he
   said -> said
   'What're -> whatre
   you -> you
   goin' -> going
   to -> to
   do -> do

以下是我目前使用的内容:

\b(\S+)\b

显然比我感兴趣的更多。

更新

单词可以以撇号开头。比如“得到他们!”

3 个答案:

答案 0 :(得分:2)

显然,你对一个单词的定义是错误的。我可能会将一个单词定义为

'?\p{L}+|p{L}+[p{L}']*

然后

随机说明:除非您完全确定需要其语义(非常罕见),否则请勿使用\b,否则在您的情况下无关紧要。 \b\w密切相关,对于语言处理同样无用,因为它包含数字和下划线。

答案 1 :(得分:1)

你可以试试这个正则表达式:

[A-Za-z]+(?:'[A-Za-z]+)*

哪个适用于大多数正则表达式引擎。其中一些组可以缩短,具体取决于正则表达式引擎的具体情况,但这是一个更通用的正则表达式。

确保撇号被字母包围。

编辑:要允许初始撇号,您只需在开头添加'?

'?[A-Za-z]+(?:'[A-Za-z]+)*

regex101 demo

答案 2 :(得分:0)

更新版本:

使用John Kugelman建议的正则表达式并添加转义字符位,这可能对您有用

#(?<!\\)[\p{L}']*\p{L}[\p{L}']*#


第一版:

这个至少在PHP中起作用:

#(?<!\\)(?:[IaA]|[A-Za-z]{2,})(?:'[A-Za-z]+)*#

http://xrg.es/#iwgvz6

这一位:(?<!\\)是为了省略转义字符