关于正则表达式中的(?:)问题
正则表达式中有一个元字符"?:"它可以使括号中匹配的内容不被捕获我试着用((?:(the))white(?:(queen)))去匹配thewhitequeen,得到的结果...
正则表达式中有一个元字符"?:"它可以使括号中匹配的内容不被捕获 我试着用((?:(the)) white (?:(queen)))去匹配the white queen,得到的结果确是the white queen,(我预期应该是" white ")似乎?:没有作用 我试了各种各样的匹配 结果都千奇百怪 难以得到我认为正确的我想要的结果 我想可能是我没有理解?:的用法 请各位高手指导 为了防止没人回答浪费分数 我给的分暂时较低 回答好了我会补更多分的 谢谢
另外有一个问题,可以回答也可以不回答:请求一个正则表达式,比如有abc & bcd & "String" & str & "123",我想得到一个能匹配它的正则表达式,灵活性高一些,如abc可能代表a.tostring(),b(),c("你好"),d_c等形式的变量或函数,&和每个元素之间的空格数可能有0个或多个,&也可以用+代替 ,另外虽然我需要匹配以上的内容,但我只需要获取其中带有""的元素,即其他的要屏蔽掉
这个问题很麻烦,如果能解决,不仅除了主要问题给你加分以外,这个问题另外加100分,谢谢了 展开
另外有一个问题,可以回答也可以不回答:请求一个正则表达式,比如有abc & bcd & "String" & str & "123",我想得到一个能匹配它的正则表达式,灵活性高一些,如abc可能代表a.tostring(),b(),c("你好"),d_c等形式的变量或函数,&和每个元素之间的空格数可能有0个或多个,&也可以用+代替 ,另外虽然我需要匹配以上的内容,但我只需要获取其中带有""的元素,即其他的要屏蔽掉
这个问题很麻烦,如果能解决,不仅除了主要问题给你加分以外,这个问题另外加100分,谢谢了 展开
3个回答
展开全部
楼主误解了(?:)的意义,(?:)是相对于()的一个概念。()的意思有两个,一个有的书上叫记忆,就是把匹配的字符保存在寄存器里,以备后用,另一个意思是分组,所以()又叫记忆分组。而(?:)只有分组的功能,分组的意思是把组内的部分看成是同一个对象对待,比如一个字符串,经常用来分割并列逻辑(就是'|')。所以分组符号只是不把匹配内容放到寄存器里,他里边的内容还是要匹配的。举个例子,比如我要匹配这样一个字符串,它由三个数字字符组成,而且第一个和第三个字符相同,这就需要记忆分组了:"(\d)\d\1",这里的\d 表示数字字符,这句话的意思是,首先匹配一个数字字符并把它记到寄存器让后再匹配下一个数字,最后寻找和的一个字符相同的数字字符,这里的\1表示第一个被记忆的分组。所以"(\d)(\d)\2\1"就表示首末相同的四数字字符串。如果想匹配三个连续的数字字符那么:"(\d\d\d)"和"(?:\d\d\d)"都可以达到要求,唯一的区别就是第二个方法没有将匹配内容存储。很显然引入(?:)就是为了在只需要分组的情况下减少cpu资源的消耗。如果要实现部分匹配可以利用环视,楼主的第一个方程可以这么写:(?<=the )white(?= queen,)
展开全部
第一个问题:
仅用于分组的括号:(?:...)
举个PHP例子
<?php
$test = "the white queen";
preg_match("/((the) white (queen))/", $test, $match);
echo $match[2].$match[3];
?>
运行结果为thequeen
<?php
$test = "the white queen";
preg_match("/((?:the) white (?:queen))/", $test, $match);
echo $match[2].$match[3];
?>
运行结果为空
也就是说,(?:...)是为了把复杂的表达式变得清晰,提高效率,不会将括号中的文本按$1之类的编号而进行反向引用,不知道你能理解么,不是你理解的除了....取....这个意思
想要你那个结果,用/^the(.+)queen$/就好了
----------------------------------------------------
第二个问题:
我理解的意思是匹配所有""中间的内容?如果是需要你说的必须为&或+中间的""中的内容,再修改
<?php
$test = 'abc & bcd & "String" + str + "123"';
preg_match_all("/.*?\"(.*?)\".*?/", $test, $match);
print_r($match[1]);
?>
运行结果
Array
(
[0] => String
[1] => 123
)
如果你需要的不是PHP代码,请查阅相关资料,我能力有限,只能帮到这了,呵呵,祝你好运
仅用于分组的括号:(?:...)
举个PHP例子
<?php
$test = "the white queen";
preg_match("/((the) white (queen))/", $test, $match);
echo $match[2].$match[3];
?>
运行结果为thequeen
<?php
$test = "the white queen";
preg_match("/((?:the) white (?:queen))/", $test, $match);
echo $match[2].$match[3];
?>
运行结果为空
也就是说,(?:...)是为了把复杂的表达式变得清晰,提高效率,不会将括号中的文本按$1之类的编号而进行反向引用,不知道你能理解么,不是你理解的除了....取....这个意思
想要你那个结果,用/^the(.+)queen$/就好了
----------------------------------------------------
第二个问题:
我理解的意思是匹配所有""中间的内容?如果是需要你说的必须为&或+中间的""中的内容,再修改
<?php
$test = 'abc & bcd & "String" + str + "123"';
preg_match_all("/.*?\"(.*?)\".*?/", $test, $match);
print_r($match[1]);
?>
运行结果
Array
(
[0] => String
[1] => 123
)
如果你需要的不是PHP代码,请查阅相关资料,我能力有限,只能帮到这了,呵呵,祝你好运
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我来回答你的问题,不是为了你的分。而是为了你。现在国内学python的太少。就花点时间教教你吧。
你对捕获的概念不太清楚,我们来看一个例子
>>> import re
>>> data = 'the white queen is a beautiful woman who likes eating apples.She is white like snow.'
>>> s = re.compile(r'''the (white) queen''') #这里我们就是专门捕获在the white queen中出现的white,正则中,小括号中代表你要捕获的内容
>>> result = re.search(s,data)
>>> result.group(1)
'white'
如上面所提及:正则中,小括号中代表你要捕获的内容,因此可以这么用:
>>> s = re.compile(r'''the (white) (queen)''') #这里我们就是专门捕获在the white queen中出现的white和queen,第几个小括号就是第几个group(search的用法)
>>> result = re.search(s,data)
>>> result.group(1)
'white'
>>> result.group(2)
'queen'
但是这样的话就出现一个问题,因为有些情况必须要用到小括号,比如:
>>> s = re.compile(r'''the (white|black) queen''')#找出颜色
>>> result = re.search(s,data)
>>> result.group(1)
'white'
如果我想要匹配queen呢:
>>> s = re.compile(r'''the (white|black) (queen)''')
>>> result = re.search(s,data)
>>> result.group(1)
'white'
>>> result.group(2)
'queen'#只有在第二个括号的时候才会被识别出来,如何才能让它作为第一个被捕获的呢
好了下面就说到你所提及的?:问题上了。它可以使括号中匹配的内容不被捕获。
因此我们这样写
>>> s = re.compile(r'''the (?:white|black) (queen)''')
>>> result = re.search(s,data)
>>> result.group(1)
'queen'
明白了吧。
下面第二个问题,上面的解答你看懂的话,第二个就不难解决。只是你的题目似乎没怎么说清楚。
我就姑且根据我的大概理解写个正则试试。
>>> import re
>>> data ='abc & bcd & "String" & str & "123"'
>>> s = re.compile(r'''(?:&|\+)\s*"(.*?)"\s*(?:&|\+)\s*\w+\s*(?:&|\+)\s*"(.*?)"''')
>>> r = re.search(s,data)
>>> if r:
... print r.group(1),r.group(2)
...
String 123
>>> r.group(1)
'String'
>>> r.group(2)
'123'
这下明白了吧。 如果你还有什么不懂可以到我空间留言,我会尽量答复的。呵呵。祝学习顺利。
你对捕获的概念不太清楚,我们来看一个例子
>>> import re
>>> data = 'the white queen is a beautiful woman who likes eating apples.She is white like snow.'
>>> s = re.compile(r'''the (white) queen''') #这里我们就是专门捕获在the white queen中出现的white,正则中,小括号中代表你要捕获的内容
>>> result = re.search(s,data)
>>> result.group(1)
'white'
如上面所提及:正则中,小括号中代表你要捕获的内容,因此可以这么用:
>>> s = re.compile(r'''the (white) (queen)''') #这里我们就是专门捕获在the white queen中出现的white和queen,第几个小括号就是第几个group(search的用法)
>>> result = re.search(s,data)
>>> result.group(1)
'white'
>>> result.group(2)
'queen'
但是这样的话就出现一个问题,因为有些情况必须要用到小括号,比如:
>>> s = re.compile(r'''the (white|black) queen''')#找出颜色
>>> result = re.search(s,data)
>>> result.group(1)
'white'
如果我想要匹配queen呢:
>>> s = re.compile(r'''the (white|black) (queen)''')
>>> result = re.search(s,data)
>>> result.group(1)
'white'
>>> result.group(2)
'queen'#只有在第二个括号的时候才会被识别出来,如何才能让它作为第一个被捕获的呢
好了下面就说到你所提及的?:问题上了。它可以使括号中匹配的内容不被捕获。
因此我们这样写
>>> s = re.compile(r'''the (?:white|black) (queen)''')
>>> result = re.search(s,data)
>>> result.group(1)
'queen'
明白了吧。
下面第二个问题,上面的解答你看懂的话,第二个就不难解决。只是你的题目似乎没怎么说清楚。
我就姑且根据我的大概理解写个正则试试。
>>> import re
>>> data ='abc & bcd & "String" & str & "123"'
>>> s = re.compile(r'''(?:&|\+)\s*"(.*?)"\s*(?:&|\+)\s*\w+\s*(?:&|\+)\s*"(.*?)"''')
>>> r = re.search(s,data)
>>> if r:
... print r.group(1),r.group(2)
...
String 123
>>> r.group(1)
'String'
>>> r.group(2)
'123'
这下明白了吧。 如果你还有什么不懂可以到我空间留言,我会尽量答复的。呵呵。祝学习顺利。
参考资料: hi.baidu.com/baigreen
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询