这是代码:
a = '000.222.tld'
b = re.search('(.*).\d+\.tld', a)
希望看到它打印
000
到目前为止..
print b.group(0)
给了我这个:
000.222.tld
print b.group(1)
给了我这个:
000.2
答案 0 :(得分:1)
你可以在没有正则表达式的情况下完成:
b = a.split('.', 1)[0]
答案 1 :(得分:1)
你的表达有一些问题:
b = re.match('\(.*)\.\d+\.com', a)
首先,\(
表示您正在转义(
- 它只会匹配搜索字符串中的文字(
字符。你没有试图匹配任何括号,你正在尝试创建一个捕获组,所以不要逃避parens。 (另外,你不转义匹配的)
,所以你会收到有关不匹配的parens尝试使用此错误的错误...)
其次,您尝试匹配.com
,但您的示例输入以.tld
结尾。那些显然不会匹配。大概你想要匹配任何字母串或其他规则吗?
最后,您没有使用原始字符串文字或转义反斜杠。有时你会逃避这一点,但你是否真的很清楚Python的反斜杠逃避规则,以确保\d
或\.
没有任何意义?您是否希望读取您的代码的人也知道?
如果你解决了所有这些问题,你的正则表达式就可以了:
>>> a = '1.2.tld'
>>> b = re.match(r'(.*)\.\d+\.[A-Za-z]+', a)
>>> b.group(1)
'1'
现在你已经完全改变了表达式和输入,你完全有不同的问题:
b = re.search('(.*).\d+\.tld', a)
除了再次使用原始字符串文字之外,这里的主要问题是你没有逃避第一个.
,所以你在那里搜索任何字符。由于默认情况下正则表达式是贪婪的,因此第一个.*
将尽可能多地捕获,同时仍为任何字符,1个或多个数字以及.tld
留出空间,因此它将匹配000.2
}。但是,如果你逃离.
,它会尽可能多地捕获,同时仍为文字.
,1位或更多位数和.tld
留出空间,这正是你想要的
>>> a = '000.222.tld'
>>> b = re.search(r'(.*)\.\d+\.tld', a)
>>> b.group(1)
'000'
同时,有一些很棒的正则表达式调试器,可以下载和在线。我不想特别推荐一个,但Debuggex可以轻松创建指向特定测试的可共享链接,因此here是您的第一个,here是您的第二个。查看示例,看看以这种方式查找模式问题的容易程度。