我有一个句子,我希望从中提取所有单词。我将一个单词定义为[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
显然比我感兴趣的更多。
更新
单词可以以撇号开头。比如“得到他们!”
答案 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]+)*
答案 2 :(得分:0)
更新版本:
使用John Kugelman建议的正则表达式并添加转义字符位,这可能对您有用
#(?<!\\)[\p{L}']*\p{L}[\p{L}']*#
第一版:
这个至少在PHP中起作用:
#(?<!\\)(?:[IaA]|[A-Za-z]{2,})(?:'[A-Za-z]+)*#
这一位:(?<!\\)
是为了省略转义字符