在开始和结束时匹配相同的模式两次

时间:2016-11-27 16:21:55

标签: python regex

我需要为标签'###'更改大写的单词。让我们在所有文本中都支持这样的字符集:[a-zA-Z\s]

我这样做:

re.sub(r'(^|\s)([A-Z]+)(\s|$)', r'\1###\3', 'Hello PYTHON WORLD')

但不是获取'Hello ### ###',而是返回'Hello ### WORLD'

问题是re.sub匹配所有出现的情况,但是,第1组和第3组等于,但是re.sub不会使用它两次来匹配PYTHON和WORLD。

我该如何解决?我正在使用python 3。

等于:几乎相等,如果是开始/结束,它们在^$中有所不同,但这不是问题。

3 个答案:

答案 0 :(得分:4)

要使用###替换所有大写字词,请使用以下方法:

s = 'Hello PYTHON WORLD'
replaced = re.sub(r'\b([A-Z]+)\b', r'###', s)
print(replaced)

输出:

Hello ### ###

\b被定义为\w\W字符之间的边界(反之亦然),或\wprivate String uploadImage() { String result = f.validate("avatar"); if(result.isEmpty()) return "none"; Http.MultipartFormData.FilePart<File> file = body.getFile("avatar"); if(file == null) return "File is empty or not exist."; String filename = file.getFilename(); /* Debug file file*/ Logger.debug("nameFile " + file.getFilename()); Logger.debug("contentFile " + file.getContentType()); /* End debug*/ File f = file.getFile(); /* Debug file f*/ String name = f.getName(); long totalSpace = f.getTotalSpace(); Logger.debug("nameF " + name); Logger.debug("sizeF " + totalSpace); /* End debug*/ try { /* File user is not f file variable*/ File fileUser = getFileUser(filename); Try.of(fileUser::delete); /* Use of org.apache.commons.io*/ FileUtils.moveFile(f, getFileUser(filename)); } catch (IOException e) { e.printStackTrace(); } return ""; } private File getFileUser(String fileName) { return new File("public/upload/avatars", user.getId().toString() + "." + FilenameUtils.getExtension(fileName)); } private boolean fileIsPicture(File f) { String mimetype = new MimetypesFileTypeMap().getContentType(f); String type = mimetype.split("/")[0]; return (type.equals("image")); } 之间的边界。字符串

答案 1 :(得分:1)

您可以使用此模式:

re.sub(r'([A-Z]+(\s|$))', r'###\2', 'Hello PYTHON WORLD')

答案 2 :(得分:0)

这是因为(\s|$)(^|\s)中匹配的空格在两个单词之间重叠。这意味着第三个词将被替换:

>>> re.sub(r'\s[A-Z]+\s', r' ### ', 'Hello WORLD PYTHON WORLD')
'Hello ### PYTHON ###'

这意味着您不希望在搜索中包含空格本身。为此,您可以使用查找断言,如下例所示:

re.sub(r'(?!(^|\s))([A-Z]+)(?=(\s|$))', r'###', 'Hello PYTHON WORLD')
'Hello ### ###'