这是一个练习代码,我在这里尝试提取印度电话号码,而不考虑前缀。
# MATCH INDIAN PHONE NUMBER IRRESPECTIVE OF PREFIX (0, + 91)
import re
string = 'Phone: +919999999999'
##string = 'Phone: 9999999999'
##string = 'Phone: 09999999999'
rexObj = re.compile(r'0?(\+\d\d)?(\d){10}')
mo = rexObj.search(string)
print(mo)
print(mo.group())
输出很好,并且我可以提取数字,而不是使用范围{m,n}我只是说数字使用{10}重复10次,这是印度语中已知的数字数目电话号码。
OUTPUT:
<re.Match object; span=(7, 20), match='+919999999999'>
+919999999999
但是我正在尝试练习{m,n}范围内的重复以及贪婪和非贪婪匹配等概念。当我将下限设置为0时,我期望返回的字符串再次为整数,因为没有?最后,匹配将是贪婪的,并提取整个10位数字。但这是输出。
rexObj = re.compile(r'0?(\+\d\d)?(\d){0,10}')
OUTPUT:
<re.Match object; span=(0, 0), match=''>
只要下限为0,上限就可以是1到10之间的任何值,结果是相同的。但是,如果将下限更改为1,结果将与我预期的一样。输出为我提供了字符串“ +919999999999”。如果将其转换为非贪婪匹配,我将再次获得并输出期望的结果。也就是说,如果下限m为1,上限n为10 {1,10},则使用非贪婪匹配时,输出为'+919'。
为什么仅当下限m设置为0时,它才不能按预期工作?而且这就像我不能将下限m设置为0一样。在另一个类似的示例中,我尝试提取带有多个o的“ no”,即使在下限是0。
string = 'That\'s a big, "nooooooooooooo!"'
rexObj = re.compile(r'noo{0,}?')
mo = rexObj.search(string)
print(mo)
print(mo.group())
在这里,我希望非贪心匹配仅提取前两个字符,而在涉及第三个字符时停止提取。输出结果符合预期。
OUTPUT:
<re.Match object; span=(15, 17), match='no'>
no
那为什么在其他模式/字符串组合上不能以这种方式工作?我看到的唯一区别是,在第一个示例中,重复的字符之前的字符是有条件的,即“ 0”和“ \ d \ d”后跟“?”。但是字符“ no”不是,并且是固定的。不过这对我来说没有意义。有人可以解释为什么python这样行吗?