如何组合这两个正则表达式? (带和不带撇号的单词)

时间:2015-12-19 06:29:22

标签: python regex

我正在尝试构建一个正则表达式来捕获字符串中的每个单词(包括撇号),如下所示:

Despite trying and trying I haven't found a regex to capture all these words

但我希望它忽略'''之类的字词,并从word读取words',从cause读取'cause;即撇号必须在文本中。

我有以下两个表达式:

[a-z]+'[a-z]+
[a-z]+

我假设他们可以通过一个简单的运算符加入,但我无法找出该运算符可能是什么。

3 个答案:

答案 0 :(得分:1)

试试这个:

(\w+'\w+)|(\w+)

上述内容仍然包含words''cause,但没有撇号。

答案 1 :(得分:1)

此正则表达式将捕获所有可以选择包含(甚至多个)'的单词,但不能以'开头或结尾

(\w[\w']+\w|\w+)

请参阅a demo here

Regular expression visualization

答案 2 :(得分:0)

使用群组和“?”优雅,应该是最快的实施。以下表达式不仅限于python,而是适用于任何接受扩展正则表达式的工具。我也不确定你想用数字做什么(另一个原因是“\ w”没有在答案中使用):

[A-ZA-Z] +('[A-ZA-Z] +)?

$ str="Despite trying and trying I haven't found a regex to capture all these words... 'cause"
$ echo "$str" | sed -r "s/[A-Za-z]+('[A-Za-z]+)?/MATCH/g"
MATCH MATCH MATCH MATCH MATCH MATCH MATCH MATCH MATCH MATCH MATCH MATCH MATCH MATCH... 'MATCH
$ echo "$str" | awk "{ gsub(/[A-Za-z]+('[A-Za-z]+)?/,\"MATCH\") } 1"
MATCH MATCH MATCH MATCH MATCH MATCH MATCH MATCH MATCH MATCH MATCH MATCH MATCH MATCH... 'MATCH

这是来自www.debuggex.com的漂亮图表......

Regular expression visualization

Debuggex Demo

基本正则表达式增加了几个:

[A-ZA-Z] \ + \('[A-ZA-Z] \ + \)\?

如果您有POSIX字符类:

EXTENDED:

[[:阿尔法:]] +('[[:阿尔法:]] +)?

BASIC:

[[:阿尔法:]] \ + \('[[:阿尔法:]] \ + \)?\