4

我正在尝试匹配一段文本中的单词组。基本上我想要每个单词有 4 个或更多字符,每组 2 个单词,第一个单词是 4 个或更多字符,第二个单词是 3 个或更多字符,每组 3 个单词,第一个单词有 4 个或更多字符和第二个和第三个有 3 个或更多字符。

我的问题是,我为此创建正则表达式的尝试仅返回匹配一次,仅针对我希望获得所有匹配的文本的给定部分。

例如,当我有以下文本时:“这是一个示例文本,用于解释我在使用正则表达式时遇到的问题”

它应该返回一个包含以下值的数组:

This
example
text
explain
problem
having
with
regular
expression
example text
explain the
having with
with the
regular expression
explain the problem
having with the
with the regular

我已经尝试过单个和单独的正则表达式,但问题仍然是它一次只能匹配字符串的一部分。例如,如果我尝试以下正则表达式:

/\b(\w{4,}\s\w{3,}\s\w{3,})\b/

它应该匹配

having with the
with the regular

我也试过

/\b(?<triple>(?<double>(?<single>\w{4,})(\s\w{3,})?)(\s\w{3,})?)\b/

这也只匹配

This
example
explain
having
regular
example text
explain the
having with
regular expression
explain the problem
having with the

任何人有更好的想法如何解决这个问题?

4

2 回答 2

1

问题是你想捕捉重叠的模式(比如“with”和“with the”)。您可以通过一些狡猾的前瞻性来做到这一点。我还没有设法用这种方法组合成一个正则表达式,但你可以这样做:

$text = 'This is an example text to explain the problem I am having with the regular expression';

preg_match_all('/\b(\w{4,})\b/', $text, $matches1);
preg_match_all('/\b(?=(\w{4,}\s+\w{3,}))\b/', $text, $matches2);
preg_match_all('/\b(?=(\w{4,}\s+\w{3,}\s+\w{3,}))\b/', $text, $matches3);

var_dump(array_merge($matches1[1], $matches2[1], $matches3[1]));
于 2013-08-30T10:45:14.217 回答
0

这个问题听起来很有趣。我不知道但我决定挑战自己用来解决它,我更习惯它。

import regex

s = r"This is an example text to explain the problem I am having with the regular expression"
[elem for t in 
    regex.findall(r'\m(?|(((\w{4,})\W+\w{3,})\W+\w{3,})|((\w{4,})\W+\w{3,})|(\w{4,}))', s, overlapped=True) 
        for elem in t if elem != '']

我已经使用了从当前字符之后的字符开始下一个匹配的regex模块及其选项。overlapped正则表达式返回元组,如:

[('This', '', ''),
 ('example text', 'example', ''),
 ('text', '', ''),
 ('explain the problem', 'explain the', 'explain'),
 ('problem', '', ''),
 ('having with the', 'having with', 'having'),
 ('with the regular', 'with the', 'with'),
 ('regular expression', 'regular', ''),
 ('expression', '', '')]

所以从那里我做了另一个循环来提取那些非空白的字段,这会产生:

['This',
 'example text',
 'example',
 'text',
 'explain the problem',
 'explain the',
 'explain',
 'problem',
 'having with the',
 'having with',
 'having',
 'with the regular',
 'with the',
 'with',
 'regular expression',
 'regular',
 'expression']
于 2013-08-30T12:15:13.913 回答