0

私はそのような文字列を持っています:

This changes are related to book:id:pages:3000 location /file1/file2/file3/pages.000.zip
This changes are related to book:id:pages:30ab00e location /file1/file2/file3/pages.000.zip

これで、数字または数字(および数字も16進数である場合があります)を「my_doc」に置き換えたいと思います:

 match = re.findall("[\.0-9]*",text)
print match

ただし、数字または数字に対してのみ機能し、16 進数に対しても機能し、数字を「my_doc」に置き換えて、行全体の出力を出力する必要があります。

This changes are related to book:id:pages:my_doc location /file1/file2/file3/pages.my_doc.zip
This changes are related to book:id:pages:my_doc location /file1/file2/file3/pages.my_doc.zip
4

3 に答える 3

1

あなたはこのようなことを試すことができます:

In [8]: import re


In [14]: strs="This changes are related to book:id:pages:3000 location /file1/file2/file3/pages.000.zip"

In [15]: re.findall(r"\d+[A-Ea-e]{0,}\d+[A-Ea-e]{0,}",strs)

Out[15]: ['3000', '000']

In [16]: strs1="This changes are related to book:id:pages:30ab00e location /file1/file2/file3/pages.000.zip"

In [17]: re.findall(r"\d+[A-Ea-e]{0,}\d+[A-Ea-e]{0,}",strs1)

Out[17]: ['30ab00e', '000']

re.sub()交換に使用:

In [68]: strs="This changes are related to book:id:pages:3000 location /file1/file2/file3/pages.000.zip"

In [69]: re.sub(r"(\d+[A-Ea-e]*\d+[A-Ea-e]*)|(\d+)","my_doc",strs)

Out[69]: 'This changes are related to book:id:pages:my_doc location /filemy_doc/filemy_doc/filemy_doc/pages.my_doc.zip'

In [70]: strs1="This changes are related to book:id:pages:30ab00e location /file1/file2/file3/pages.000.zip"

In [71]: re.sub(r"(\d+[A-Ea-e]*\d+[A-Ea-e]*)|(\d+)","my_doc",strs1)
Out[71]: 'This changes are related to book:id:pages:my_doc location /filemy_doc/filemy_doc/filemy_doc/pages.my_doc.zip'

In [72]: foo=" number of pages completed, 2 still pending" 

In [73]: re.sub(r"(\d+[A-Ea-e]*\d+[A-Ea-e]*)|(\d+)","my_doc",foo)
Out[73]: ' number of pages completed, my_doc still pending'
于 2012-12-07T05:10:57.820 に答える
0

正規表現で条件付きを検討してください:http ://www.asiteaboutnothing.net/regex/regex-conditionals.html

于 2012-12-07T05:09:34.637 に答える
0

これはクレイジーで(あなたの質問のように)ハックです!

16 進文字 (az、AZ) は文字列内の多くの場所に出現するため、それらは置き換えられます (質問は atm をオブジェクトにしないと考えられていました;)) 予想される動作ではないようです。

削除されるブロブ/部分が 16 進ワードであると仮定し、最小の長さが 3 であると仮定すると、次のようになります。

import re
from string import hexdigits


str_1 = "This changes are related to book:id:pages:3000 location /file1/file2/file3/pages.000.zip"

str_2 = "This changes are related to book:id:pages:30ab00e location /file1/file2/file3/pages.000.zip"

expression = '[%s]{3,}'%(string.hexdigits)  # = '[' + hexdigits + ']{3,}'
re.sub(exp, 'my_doc', str_1)

編集:少しクレイジーな正規表現ではなく、次の式を使用します

expression = ':[%s]+\S'%(hexdigits)

これは 16 進数の単語のみに一致するため、16 進数と数字の長さはもはや制約ではありません。

于 2012-12-07T10:02:09.813 に答える