我需要为标签'###'
更改大写的单词。让我们在所有文本中都支持这样的字符集:[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。
等于:几乎相等,如果是开始/结束,它们在^
和$
中有所不同,但这不是问题。
答案 0 :(得分:4)
要使用###
替换所有大写字词,请使用以下方法:
s = 'Hello PYTHON WORLD'
replaced = re.sub(r'\b([A-Z]+)\b', r'###', s)
print(replaced)
输出:
Hello ### ###
\b
被定义为\w
和\W
字符之间的边界(反之亦然),或\w
与private 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 ### ###'