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



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

输入文本:

Don't-thread 0 '' ' 'on rnme!

应该给:

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

这显然比我感兴趣的要匹配得多。

更新:

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

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

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

然后。

随机注意:不要使用b,除非您绝对确定您想要它的语义(非常罕见)或者在您的情况下无关紧要。 bw密切相关,对于语言处理同样无用,因为它包括数字和下划线。

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

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

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

确保撇号被字母包围。

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

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

正则表达式101演示

更新版本:

使用约翰·库格尔曼建议的正则表达式并添加转义字符位这可能对您有用

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


第一个版本:

这个至少在 PHP 中有效:

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

http://xrg.es/#iwgvz6

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

最新更新