我正在尝试从一段文字中匹配单词组。基本上我希望每个单词有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
任何人都知道如何解决这个问题?
答案 0 :(得分:1)
问题是你想要捕捉重叠的模式(比如“with 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]));
答案 1 :(得分:0)
这个问题听起来很有意思。我不知道php但是我决定挑战自己用python来解决它,我已经习惯了它。
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']