如何确保正则表达式不在 [] 或 {} 中?

How to make sure that regex is not in [] or {}?

我正在尝试用随机单词列表替换给定句子中的所有单词。这是我的代码:

import re
import random

WORDS = ["Brawk" , "Buh-gok", "Bok bok", "Bawk"] # My random word list
PATTERN = r"([a-zA-Z0-9\']+)"
DELIMITER = " "

def callback(matchobj):
    return random.choice(WORDS)

def parse_sentence(sentence):
    return re.sub(PATTERN, callback, sentence)

当我运行代码时,是这样的:

>>> print(parse_sentence("some text's[color=#ff8a00]smoe more text[/color]{n}"))
Bok bok Bok bok[Buh-gok=#Buh-gok]Bok bok Buh-gok Buh-gok[/Bawk]{Brawk}

我需要它是 Buh-gok Bok bok[color=#ff8a00]Bok bok Bok bok Bawk[/color]{n},所以如果它在 []{} 内,是否可以忽略它?

代码中需要修改两处:

PATTERN = r"(\[[^][]*]|\{[^{}]*})|[a-zA-Z0-9']+"

def callback(matchobj):
    return matchobj.group(1) or random.choice(WORDS)

参见Python demo

正则表达式 - (\[[^][]*]|\{[^{}]*})|[a-zA-Z0-9']+ - 将方括号之间和大括号之间的所有子字符串匹配并捕获到组 1 中,并且只匹配字母数字字符块,并且 return matchobj.group(1) or random.choice(WORDS) returns 组 1值(如果第 1 组匹配),或者如果第 1 组不匹配,则为随机词。

图案详情:

  • ( - 捕获组 #1 的开始
    • \[[^][]*] - [,然后是 ][ 以外的任何零个或多个字符,然后是 ] 字符
    • | - 或
    • \{[^{}]*} - {,然后是 {} 以外的任何零个或多个字符,然后是 } 字符
  • ) - 小组结束
  • | - 或
  • [a-zA-Z0-9']+ - 一个或多个 ASCII 字母或数字或 '.