値を再割り当てすると、Pythonでは一定の時間がかかります。 Cのような言語とは異なり、変数は「名前タグ」のほうが多いです。したがって、名前タグが指し示すものを変更することは、ほとんど時間がかかりません。
def sub_func_2(text):
for regex, sub in regexes:
text = re.sub(regex, sub, text)
return text
しかし、あなたの正規表現は、実際にしている場合:リストだけを反復、あなたの関数で、その後
regexes = (
(regex_1, 'string_1'),
(regex_2, 'string_2'),
(regex_3, 'string_3'),
...
)
そして:彼らは定数文字列がある場合、私はタプルにそれらを集めるでしょう
regex_1
、regex_2
などのように、おそらく何らかの並べ替えのリストに直接定義する必要があります。 >'dog'
、str.replace()
方法は、(text = text.replace('cat', 'dog')
)方が簡単な場合があります、そしてそれはおそらく速くなる -
また、あなたが'cat'
のような置換を行っている場合は、注意してください。
あなたの文字列がある場合は正規表現と最初からそれを非常に長く、そして再作成するには、非常に長くかかることがあります。コメントで述べた@Oliver Charlesworth'sメソッドの実装は次のようになります。
# Instead of this:
regexes = (
('1(1)', '$1i'),
('2(2)(2)', '$1a$2'),
('(3)(3)3', '$1a$2')
)
# Merge the regexes:
regex = re.compile('(1(1))|(2(2)(2))|((3)(3)3)')
substitutions = (
'{1}i', '{1}a{2}', '{1}a{2}'
)
# Keep track of how many groups are in each alternative
group_nos = (1, 2, 2)
cumulative = [1]
for i in group_nos:
cumulative.append(cumulative[-1] + i + 1)
del i
cumulative = tuple(zip(substitutions, cumulative))
def _sub_func(match):
iter_ = iter(cumulative)
for sub, x in iter_:
if match.group(x) is not None:
return sub.format(*map(match.group, range(x, next(iter_)[1])))
def sub_func(text):
return re.sub(regex, _sub_func, text)
しかし、あなたは、あなたが代用する必要があるテキストが重複している場合、これは分解します。
これらの置き換えが相互に排他的である場合、** re **(re.compile( "pattern1 | pattern2 | ...")、function_that_handles_match、text) 'を実行する方が速いかもしれません。 (未確認の仮説:もちろん) –
@Pythonistaは、正規表現ごとに別の文字列を代入したい場合にはうまくいきません – victor
変数xxx_1、xxx_2などの名前を付けると、これは記号あなたは本当にこれらをリストに集めたいと思っています。追加や並べ替えがはるかに簡単になり、リストを反復することは 'do_this_to(xxx_1);のコピー/ペーストより簡単です。 do_this_to(xxx_2);それは何ですか? do_this_to(xxx_3); – PaulMcG