我有一个字符串如下所示:
s: str = 'ENGBNAmphitheatre Pkwy\x1e\x1eNASY%am|fi|te|"a|tre;ENGY*"{m|fI|%Ti|t@r;ENGY"{m|fI|%Ti|t@r *"pArk|%we;NASY%am|fi|te|"a|tre "par|kwei'
我想使用复合Regex(不使用两个单独的replace命令)提取两个子字符串模式之间的字符串。
下面是我想用空格替换哪些字符串的解释,这样就留下了我想提取的中间部分。
# Replace leading 'ENGBN' with '' (blank)
pat1: str = "ENGBN"
# Replace this specific substring (that has special characters such as \x1e) with '' (blank)
pat2: str = """\x1e\x1eNASY%am|fi|te|"a|tre;ENGY*"{m|fI|%Ti|t@r;ENGY"{m|fI|%Ti|t@r *"pArk|%we;NASY%am|fi|te|"a|tre "par|kwei"""
预期结果:
result: str = "Amphitheatre Pkwy"
我正试图从总体上了解更多关于Regex的知识,因此还需要解释一下所提出的单一模式的作用。
3条答案
按热度按时间iswrvxsc1#
试试这个
pattern = r'(?<=^ENGBN)[^\x1e]+'
它将提取前面有“ENGBN”并且包含一个或多个不是
\x1e
的字符的子字符串。这里是一个完整的解决方案trinket.io/python/082a3601c1的链接
vsaztqbk2#
您只需要调用
re.sub
,将您希望替换的两个单独字符串与|
运算符组合指定为搜索字符串。因为第二个搜索字符串包含被识别为正则表达式操作符的特殊字符,例如”|',此字符串需要正确转义:图纸:
更新
要在两个子字符串之间搜索字符串(假设第一个子字符串的长度是恒定的,否则使用PyPi存储库中的
regex
包):图纸:
fae0ux8s3#
代码说明
***re.compile***创建一个正则表达式对象,该对象可用于使用其***match()***、***search()***和其他方法进行匹配,如下所述。
烟斗***|* 模式中的符号 *f”{re.escape(pat 1)}|{re.escape(pat 2)}"***用于表示正则表达式中的OR。这意味着模式将匹配 * pat 1 * 或 * pat 2 *。
re.escape**用于转义模式中的所有特殊字符。这是必要的,因为第二个模式包含几个特殊字符(\x1e,| ,",; 、、{、}、%、@ 和 * 我们 )。如果不转义这些字符,正则表达式引擎将把它们解释为特殊的正则表达式符号,而不是原义字符。
***re.sub**用于将字符串中与模式匹配的部分替换为空字符串。第一个参数是模式,第二个参数是替换字符串,第三个参数是要修改的字符串。
该脚本的工作方式是查找字符串中与 * pat 1 * 或 * pat 2 * 匹配的任何部分,并将其替换为空字符串。因为 * pat 1 * 和 * pat 2 * 都在字符串的开头,所以剩下的字符串是 Amphitheatre Pkwy。