1

我需要在字符串中找到子字符串的位置。

子字符串是字符 ",0*" 后跟 [0-9] 或 [AF] 的两个字符,即

kdjrnnj,0*B3;,w0l44
       ^^^^^
qui8ecc),0*21qxxcd4))
        ^^^^^

子字符串的长度总是正好 5 个字符。子字符串之前总是有一些(未知)字符。子字符串后面可能有也可能没有字符。

我想使用 re.something 在字符串中找到我的子字符串的起始位置。我的正则表达式知识很差 - 如果有人能告诉我如何做到这一点,你会节省我数小时的黑客时间。

谢谢

4

4 回答 4

3

使用match objectstart()方法:

>>> r = re.compile(r',0\*[0-9A-F]{2}')
>>> m = r.search("kdjrnnj,0*B3;,w0l44")
>>> if m : print m.start()
7
>>> m = r.search("qui8ecc),0*21qxxcd4))")
>>> if m : print m.start()
8

下一步是删除子字符串之后的所有内容

您不需要索引,也可以使用正则表达式完成:

>>> strs = "qui8ecc),0*21qxxcd4))"
>>> re.search(r'.*?,0\*[0-9A-F]{2}', strs).group()
'qui8ecc),0*21'

>>> m = r.search("kdjrnnj,0*B3;,w0l44")
>>> if m : print m.group()
kdjrnnj,0*B3

re.search比这里更快re.sub

>>> strs = 'kdjrnnj,0*B3;,w0l44'
>>> %timeit r.search(strs).group()
100000 loops, best of 3: 1.42 us per loop
>>> %timeit pattern.sub('', strs)
100000 loops, best of 3: 2.79 us per loop

>>> strs = 'kdjrnnj,0*B3;,w0l44'*1000
>>> %timeit r.search(strs).group()
100000 loops, best of 3: 1.43 us per loop
>>> %timeit pattern.sub('', strs)
10000 loops, best of 3: 59.9 us per loop

>>> strs = 'kdjrnnj'*1000 + ',0*B3;,w0l44'
>>> %timeit r.search(strs).group()
1000 loops, best of 3: 260 us per loop
>>> %timeit pattern.sub('', strs)
1000 loops, best of 3: 410 us per loop
于 2013-09-07T08:55:57.407 回答
0

Python在匹配时re.search()返回一个MatchObject()实例,它包含一个.start()为您提供匹配位置的方法:

import re

pattern = re.compile(r',0\*[0-9A-F]{2}')

match = pattern.search(inputstring)
if match:
    print match.start()

请注意\*;星号 ( *) 是正则表达式元字符,因此需要使用斜杠对其进行转义以匹配文字*

定义了一个匹配两个命名范围中的任何字符的[0-9A-F]字符类,并且下面的类将其限制为恰好{2}匹配两个字符。

演示:

>>> import re
>>> pattern = re.compile(r',0\*[0-9A-F]{2}')
>>> match = pattern.search('kdjrnnj,0*B3;,w0l44')
>>> match.start()
7
>>> match.group()
',0*B3'
>>> match = pattern.search('qui8ecc),0*21qxxcd4))')
>>> match.start()
8
>>> match.group()
',0*21'

如果您需要删除此字符串之后re.sub()的所有内容,请改用:

pattern = re.compile(r'(?<=,0\*[0-9A-F]{2}).*')

newstring = pattern.sub('', oldstring)

这使用了后视断言;它查找您的模式,然后匹配后面的所有内容,然后re.sub()调用从输入字符串中删除匹配的内容。

演示:

>>> pattern = re.compile(r'(?<=,0\*[0-9A-F]{2}).*')
>>> pattern.sub('', 'kdjrnnj,0*B3;,w0l44')
'kdjrnnj,0*B3'
>>> pattern.sub('', 'qui8ecc),0*21qxxcd4))')
'qui8ecc),0*21'

请注意之后的一切,0*B3,0*21现在都消失了。

于 2013-09-07T08:56:20.317 回答
0

正则表达式应该很简单:.*,0\*[0-9A-F]{2}.

于 2013-09-07T08:56:35.387 回答
0

使用re.search()

re.search(r',0*[0-9A-F][0-9A-F]', your_string).start()

于 2013-09-07T08:56:36.233 回答