重新分配一個值在Python中需要一段時間。與C語言不同,變量更多地是「名稱標籤」。因此,改變名稱標籤指向的時間非常短。
如果他們是常量字符串,我將它們收集到一個元組:
regexes = (
(regex_1, 'string_1'),
(regex_2, 'string_2'),
(regex_3, 'string_3'),
...
)
,然後在功能,只需遍歷列表:
def sub_func_2(text):
for regex, sub in regexes:
text = re.sub(regex, sub, text)
return text
但如果你的正則表達式實際上是名稱爲regex_1
,regex_2
等,它們可能應該直接定義在某種列表中。
另外請注意,如果你正在做替換像'cat'
- >'dog'
,在str.replace()
方法可能會更容易(text = text.replace('cat', 'dog')
),它可能會更快。
如果你的字符串是非常長,再使其從頭開始用正則表達式可能需要很長時間。這是在評論中提到的可能是@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.sub(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_2a_which_i_needed_between_2_and_3_but_didnt_want_to_renumber_everything); do_this_to(XXX_3);等等。 – PaulMcG