9

Python の正規表現モジュールを使用して、文字列を照合したいと思います。

私の場合、文字列の開始、終了、および「_」で結合された大文字で構成されていることを確認したいと思います。例として、「MY_HERO2」という文字列が有効です。次の文字列は無効です: "_MY_HREO2"、"MY HERO2"、"MY_HERO2_"

文字列を検証するには、次のコードを使用します。

import re
my_string = "MY_HERO"   

p = re.compile("^([A-Z,0-9]+_??)+[A-Z,0-9]$")
if p.match(my_string):
    print "validated"

それで、私の問題は何ですか?空白を含む長い文字列の検証は非常に遅いです。どうすればこれを回避できますか? 私のパターンは間違っていますか?この動作の理由は何ですか?

ここにいくつかの数字があります:

MY_HERO2 --> 53 ms
MY_SUPER_GREAT_UNBELIEVABLE_HERO --> 69 microseconds
MY_SUPER_GREAT_UNBELIEVABLE HERO --> 223576 microseconds
MY_SUPER_GREAT_UNBELIEVABLE_STRONG_HERO --> 15 microseconds
MY_SUPER_GREAT_UNBELIEVABLE_STRONG HERO --> 979429 microseconds

事前にアンサーと応答をありがとう。:-) ポール

4

2 に答える 2

0

次の単純な正規表現を使用して同じ結果を得ることができます。

import timeit

stmt = '''
import re
reg = '^(?:[A-Z0-9][A-Z0-9_]*)?[A-Z0-9]$'
p = re.compile(reg)
p.match('%s')
'''

str_list = ['MY_HERO2', 'MY_SUPER_GREAT_UNBELIEVABLE_HERO', 'MY_SUPER_GREAT_UNBELIEVABLE HERO', 'MY_SUPER_GREAT_UNBELIEVABLE_STRONG_HERO', 'MY_SUPER_GREAT_UNBELIEVABLE_STRONG HERO']

for s in str_list:
    t = timeit.timeit(stmt%s, number=1000)
    print '%s: %s' % (s, t)

import re
reg = '^(?:[A-Z0-9][A-Z0-9_]*)?[A-Z0-9]$'
p = re.compile(reg)
for s in str_list:
    result = p.match(s) is not None
    print '%s: %s' % (s, result)

結果:

MY_HERO2: 0.00375986099243
MY_SUPER_GREAT_UNBELIEVABLE_HERO: 0.00417900085449
MY_SUPER_GREAT_UNBELIEVABLE HERO: 0.00534510612488
MY_SUPER_GREAT_UNBELIEVABLE_STRONG_HERO: 0.00419306755066
MY_SUPER_GREAT_UNBELIEVABLE_STRONG HERO: 0.00567102432251

MY_HERO2: True
MY_SUPER_GREAT_UNBELIEVABLE_HERO: True
MY_SUPER_GREAT_UNBELIEVABLE HERO: False
MY_SUPER_GREAT_UNBELIEVABLE_STRONG_HERO: True
MY_SUPER_GREAT_UNBELIEVABLE_STRONG HERO: False
于 2013-08-28T11:04:08.010 に答える