正则表达式搜索显示不同的结果

时间:2016-01-25 05:07:21

标签: python regex

我想在Python 2.7上使用正则表达式在><之间提取数字

即。从3213>1234<32131234

但结果(print(data2))没有显示任何内容。有什么问题?

我在Ubuntu和Windows pydev上测试了下面的代码。

import re

a = "3213>1234<3213"
p = re.compile('>[0-9]*<')
data = p.search(a).group()
print(data)

p2 = re.compile('[0-9]*')
data2 = p2.search(data).group()
print(data2)

5 个答案:

答案 0 :(得分:2)

问题您在[0-9]*中获得'>1234<'的最早可能匹配,并且实际上是>之前的空字符串,在data2 = data[1:-1]之前{1}}。

除了直接正则表达式解决方案之外,您还可以使用protected override bool HasAdditionalUpdateAccess() { return true; }简单地修复您的问题。

答案 1 :(得分:1)

>>> string='3213>1234<3213'
>>> re.search(r'(?<=>)[^<]+(?=<)', string).group()
'1234'
  • (?<=>)是在所需匹配之前确保>的零宽度正向后视模式

  • [^<]+将选择所需的部分,即>到下一个<之后的部分,在这种情况下为1234

  • (?=<)是在所需匹配后确保>的零宽度正向前瞻模式

答案 2 :(得分:1)

因为您尝试在[0-9]*上使用>1234<*尝试匹配 0或更多位数。

因此,当它试图在字符串的第一个字母上找到一个数字时,它会给出一个空字符串,即>

您可以将re.search()替换为re.findall(),看看发生了什么:

import re

a = "3213>1234<3213"
p = re.compile('>[0-9]*<')
data = p.search(a).group()
print(data)

p2 = re.compile('[0-9]*')
data2 = p2.findall(data)
print(data2)

输出:

['', '1234', '', '']

您需要在此使用[0-9]+代替[0-9]*。匹配 1位或更多位。因此,它会跳过><

>>> p2 = re.compile('[0-9]+')
>>> data2 = p2.search(data).group()
>>> print(data2)
1234

您还可以通过p2>完全放弃<捕获 p = re.compile('>([0-9]+)<')data = p.search(a).group(1)中的数字。像这样:

>>> import re
>>> a = "3213>1234<3213"
>>> p = re.compile('>([0-9]+)<')
>>> data = p.search(a).group(1)
>>> print(data)
1234

答案 3 :(得分:0)

您可以对搜索进行分组:

{{1}}

答案 4 :(得分:0)

正则表达式查找 > 任意数字 < 并且 findall 返回匹配列表。然后迭代匹配

 a = "3213>1234<3213>5123<"

  p = re.compile('>([0-9]+)<')
  data=p.findall(a)

  for item in data:
      print(item)

输出:

  1234
  5123