0

我有一个句子,我希望从中提取所有单词。我将一个词定义为 [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

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

更新:

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

4

3 回答 3

2

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

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

然后。

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

于 2013-09-24T15:11:48.577 回答
1

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

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

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

确保撇号被字母包围。

编辑:要允许初始撇号,您可以简单地'?在开头添加一个:

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

正则表达式101演示

于 2013-09-24T15:18:15.950 回答
0

更新后的版本:

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

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


第一个版本:

这个至少在 PHP 中有效:

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

http://xrg.es/#iwgvz6

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

于 2013-09-24T15:25:40.007 回答