从Python中的RegEx中删除和理解两个特殊的子字符串

nnt7mjpx  于 2023-06-30  发布在  Python
关注(0)|答案(3)|浏览(139)

我有一个字符串如下所示:

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的知识,因此还需要解释一下所提出的单一模式的作用。

iswrvxsc

iswrvxsc1#

试试这个pattern = r'(?<=^ENGBN)[^\x1e]+'
它将提取前面有“ENGBN”并且包含一个或多个不是\x1e的字符的子字符串。
这里是一个完整的解决方案trinket.io/python/082a3601c1的链接

vsaztqbk

vsaztqbk2#

您只需要调用re.sub,将您希望替换的两个单独字符串与|运算符组合指定为搜索字符串。因为第二个搜索字符串包含被识别为正则表达式操作符的特殊字符,例如”|',此字符串需要正确转义:

import re

s = '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'
search_string_1 = "^ENGBN" # ENGBN at the start of the string
search_string_2 = re.escape('\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')
# Or just use the following based on the OP's comment below:
#search_string_2 = r'\x1e[\s\S]*$'
print(re.sub(f'{search_string_1}|{search_string_2}', '', s))

图纸:

Amphitheatre Pkwy

更新

要在两个子字符串之间搜索字符串(假设第一个子字符串的长度是恒定的,否则使用PyPi存储库中的regex包):

import re

s = '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'
search_string_1 = "^ENGBN"
search_string_2 = '\x1e'
print(re.search(f'(?<={search_string_1}).*?(?={search_string_2})', s).group(0))

图纸:

Amphitheatre Pkwy
fae0ux8s

fae0ux8s3#

import re

s = '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'
pat1 = "ENGBN"
pat2 = "\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"

# Use re.escape to correctly escape special characters in your pattern
pattern = re.compile(f"{re.escape(pat1)}|{re.escape(pat2)}")

# Use re.sub to replace the pattern with an empty string
result = pattern.sub("", s)

print(result)

代码说明
***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

相关问题