python re.sub的行为与re.search不一致

时间:2018-08-08 15:03:41

标签: python regex

我有一段代码试图进行搜索和替换。我的代码通常可以按预期工作,但是我遇到了一个用例不符合我的期望。在有问题的示例中,我有

api/auth/getuser/{sessionGuid}

最初

http://localhost:5000/

我的代码片段:

@GetMapping(value = "/books/{userId}")
@PreFilter("hasRole('ADMIN') or principal.userId == pathVar.userId")
public List<Books> getBooks(@PathVariable("userId" String userId) {
   //do sth
}

我希望将input_text更改为

input_regex = 'Cooper S \\(3doors\\)'
subst_regex = 'Cooper S Hardtop 2 Door'

完成后,即使我确认确实从input_text = 'cooper s (3doors)' 创建了Matchobject,它也没有改变。如果对matchobject = re.search(input_regex,input_text,re.IGNORECASE) if matchobject: input_text=re.sub(input_regex,subst_regex,input_text,re.IGNORECASE) 的{​​{1}}进行了'Cooper S Hardtop 2 Door' 的操作,为什么re.search找不到相同的匹配项并进行替换?

3 个答案:

答案 0 :(得分:2)

对于正则表达式模式始终使用原始字符串。 re.sub的第4个arg不是标志。因此,请确保在调用flags=re.IGNORECASE时指定re.sub

>>> input_regex = r'Cooper S \(3doors\)'
>>> re.search(input_regex,input_text,re.IGNORECASE)
<re.Match object; span=(0, 17), match='cooper s (3doors)'>
>>> re.sub(input_regex,subst_regex,input_text, flags=re.IGNORECASE)
'Cooper S Hardtop 2 Door'

答案 1 :(得分:0)

您可以采用regex的方式:

import re

input_text = 'cooper s (3doors)'
input_regex = '\(3doors\)'
subst_regex = 'Hardtop 2 Door'

print(re.sub(input_regex, subst_regex, input_text))

或者只是一种非regex的方式:

print(input_text.replace('(3doors)', 'Hardtop 2 Door'))

答案 2 :(得分:0)

执行以下操作:

import re
input_regex = re.compile("\\(3doors\\)", re.IGNORECASE)
subset_regex = "Hardtop 2 Door"
input_text = "cooper s (3doors)"
result = input_regex.sub(subset_regex, input_text)

跳过您要进行重新搜索的部分。不需要结果是:

cooper s Hardtop 2 Door

注意:不要在正则表达式变量中给出整个文本。没用正则表达式不是这样的