我是Python的初学者,刚刚学习了正则表达式。
我想要做的是使用正则表达式方法制作条带特征(strip())
以下是我写的代码,
import regex
stripRegex = regex.compile(r"(\s*)((\S*\s*\S)*)(\s*)")
text = ' Hello World This is me Speaking '
check = stripRegex.search(text)
print(check)
print('group 1 :', stripRegex.search(text).group(1))
print('group 2 :', stripRegex.search(text).group(2))
print('group 3 :', stripRegex.search(text).group(3))
print('group 4 :', stripRegex.search(text).group(4))
结果是,
第1组:
第2组:Hello World这是我说话的
第3组:达到峰值
第4组:
在这里,我想知道两件事
1)组3如何返回'峰值'?
2)python是否识别'('按顺序并分配首先出现的数字?
所以在这段代码中,(\ s *)((\ S * \ s * \ S))(\ s )
第一个(\ s *) - 是第一组
((\ S * \ s * \ S)) - 第二个,
(\ S \ s * \ S) - 第三,
第二个(\ s *) - 第四个。
AM我是对的?
答案 0 :(得分:1)
你是对的。 \ S * \ s * \ S匹配:
\S* - at least 0 non-whitespace
\s* - at least 0 whitespace
\S - one non-whitespace
第3组(\ S * \ s * \ S)重复进给第2组((\ S * \ s * \ S)*),因此第3组将包含它送给组的最后一个匹配2:0或更多非空格的最后一个可能的匹配,后跟0或更多的空格,后跟一个非空格是“#”。这可以通过它的第一场比赛来解释:
'Hello T'
\S* matches 'Hello'
\s* matches ' '
\S matches 'T'
如果你重复这个,你将从每个单词的前面加上第一个字母:
'his i'
\S* matches 'his'
\s* matches ' '
\S matches 'i'
等等,直到......
最终的比赛然后省略了最后一个单词的第一个字母,不需要任何空格,并且必须以一个非空格结束:
'tring'
\S* matches 'trin'
\s* matches '' (at least 0 whitespace, so zero)
\S matches 'g'
答案 1 :(得分:1)
Q2:你是对的。从左到右,第一个(
是第1组的开头,第二个(
是第2组的开头,等等。
Q1:由于之前的*
,第3组重复匹配。它的最终值将是最终匹配的值。第3组的匹配是:
"Hello W" where \S*="Hello" \s*=" " \S="W"
"orld T" where \S*="orld" \s*=" " \S="T"
"his i" where \S*="his" \s*=" " \S="i"
"s m" where \S*="s" \s*=" " \S="m"
"e S" where \S*="e" \s*=" " \S="S"
"peaking" where \S*="peakin" \s*="" \S="g"
这是理解你的正则表达式的绝佳工具:https://regex101.com/r/MmYOPT/1(虽然这对重复匹配没有多大帮助)。