我有一个句子,我希望从中提取所有单词。我将一个单词定义为 [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
,除非您绝对确定您想要它的语义(非常罕见)或者在您的情况下无关紧要。 b
与w
密切相关,对于语言处理同样无用,因为它包括数字和下划线。
你可以试试这个正则表达式:
[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
这位:(?<!\)
是省略转义字符