如何解决:b = re.search(' \(。*)。\ d + \ .tld',a)

时间:2014-09-24 23:48:44

标签: python python-2.7

这是代码:

a = '000.222.tld'
b = re.search('(.*).\d+\.tld', a)

希望看到它打印

000

到目前为止..

  print b.group(0)

给了我这个:

  000.222.tld

   print b.group(1)

给了我这个:

000.2

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是您的第二个。查看示例,看看以这种方式查找模式问题的容易程度。