我想在Python 2.7上使用正则表达式在>
和<
之间提取数字
即。从3213>1234<3213
到1234
。
但结果(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)
答案 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