基于Django和Python中的正则表达式模式的小写



我使用的脚本调用s_lower方法将所有文本转换为小写,但有一个陷阱:如果它是一个链接(有一个特殊的正则表达式(,那么它不会小写。因此,我想将相同或相似的逻辑应用于其他正则表达式。

RE_WEBURL_NC = (
r"(?:(?:(?:(?:https?):)//)(?:(?!(?:10|127)(?:.d{1,3}){3})(?!(?:169.254|192.168)(?:.d{1,3}){2})(?!172.(?:1["
r"6-9]|2d|3[0-1])(?:.d{1,3}){2})(?:[1-9]d?|1dd|2[01]d|22[0-3])(?:.(?:1?d{1,2}|2[0-4]d|25[0-5])){2}(?:.(?"
r":[1-9]d?|1dd|2[0-4]d|25[0-4]))|(?:(?:[a-z0-9][a-z0-9_-]{0,62})?[a-z0-9].)+(?:[a-z]{2,}.?))(?::d{2,5})?)(?:"
r"(?:[/?#](?:(?![s"<>{}|\^~[]`])(?!&lt;|&gt;|&quot;|&#x27;).)*))?"
)
def s_lower(value):
url_nc = re.compile(f"({RE_WEBURL_NC})")
# Do not lowercase links
if url_nc.search(value):
substrings = url_nc.split(value)
for idx, substr in enumerate(substrings):
if not url_nc.match(substr):
substrings[idx] = i18n_lower(substr)
return "".join(substrings)
return i18n_lower(value)

除了特殊标记中的文本之外,我想将所有文本小写。

def s_lower(value):
spec_nc = re.compile(r"[spec .*]") # this is for [spec some raNdoM cAsE text here]
if spec_nc.search(value):
substrings = spec_nc.split(value)
for idx, substr in enumerate(substrings):
if not spec_nc.match(substr):
substrings[idx] = i18n_lower(substr)
return "".join(substrings)
return i18n_lower(value)

本来是作为注释写的,但太长了。。。

您实际上还没有说明问题所在,但看起来缺少正则表达式周围的()(因此拆分的字符串最终会出现在substrings中(。应该是

spec_nc = re.compile(r"([spec .*])")

注:

  • 您应该使用[^]]*而不是.*,以确保您的匹配保持在一组[]
  • 您实际上不需要search,如果字符串不存在,那么split将简单地返回单个元素列表中的原始字符串,您仍然可以迭代该列表
  • 您不需要呼叫match;匹配split regex的字符串将始终在列表的奇数索引中,因此您可以根据idx降低大小写

因此您可以将代码简化为:

def s_lower(value):
spec_nc = re.compile(r"([spec [^]]*])") # this is for [spec some raNdoM cAsE text here]

substrings = spec_nc.split(value)
for idx, substr in enumerate(substrings):
if idx % 2 == 0:
substrings[idx] = i18n_lower(substr)
return "".join(substrings)

最新更新