我有不同的字符串,形式为_AHDHDUHD[Tsfs (SGYA)]AHUDSHDI_
,我想删去(SGYA)
部分(始终用大括号括起来)和最后一个空格。因此结果应为_AHDHDUHD[Tsfs]AHUDSHDI_
。
我的想法是将方括号的内容与([A-Z_])(\[.+\])([A-Z_])
匹配,然后进行拆分,然后使用re
模块将其重新插入(尽管我不确定哪个re
功能适用于此)。
但是,这感觉不佳。是否有regex
可以直接执行我想要的操作,而无需中介步骤?
答案 0 :(得分:1)
您可以使用
re.sub(r'(\[[^][]*?)\s*\([A-Z]*\)\s*([^][]*])', r'\1\2', text)
请参见regex demo
详细信息
(\[[^][]*?)
-第1组:一个[
,然后除[
和]
以外的任何0+个字符都尽可能少\s*
-超过0个空格\(
-一个(
字符[A-Z]*
-0+个大写ASCII字母\)
-一个)
字符\s*
-超过0个空格([^][]*])
-第2组:除]
和[
(尽可能多)之外的任意0+个字符,然后是]
import re
rx = r"(\[[^][]*?)\s*\([A-Z]*\)\s*([^][]*])"
s = "_AHDHDUHD[Tsfs (SGYA)]AHUDSHDI"
print( re.sub(rx, r'\1\2', s) )
# => _AHDHDUHD[Tsfs]AHUDSHDI
另一个想法:仅在\s*\([A-Z]+\)\s*
子字符串中找到所有[...]
匹配项:
import re
s = "_AHDHDUHD[Tsfs (SGYA)]AHUDSHDI"
print( re.sub(r"\[[^][]+]", lambda x: re.sub(r'\s*\([A-Z]+\)\s*', "", x.group()), s) )
# => _AHDHDUHD[Tsfs]AHUDSHDI
在这里,\[[^][]+]
模式将找到[
的所有块,然后是除方括号之外的1+个字符,然后是]
,然后是0+的空白,{ {1}},1+大写ASCII字母,(
和0+空格将仅在使用)
模式找到的匹配项内删除。
答案 1 :(得分:1)
import re
weirdstring = "_AHDHDUHD[Tsfs (SGYA)]AHUDSHDI_"
weirdstring = re.sub(r'(.*?)(\s*\(.*?\)\s*)(.*?)', r'\1\3', weirdstring)
print(weirdstring)
# prints _AHDHDUHD[Tsfs]AHUDSHDI_
答案 2 :(得分:1)
这将满足您的要求:
Python 3.7.5 (default, Oct 17 2019, 12:16:48)
[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> s='_AHDHDUHD[Tsfs (SGYA)]AHUDSHDI_'
>>> re.sub(r'(?:\s?\((.*)\))', '', s)
'_AHDHDUHD[Tsfs]AHUDSHDI_'
>>>
如果只想在方括号内匹配大写字母,则表达式应为:
>>> re.sub(r'(?:\s?\(([A-Z]+)\))', '', s)
'_AHDHDUHD[Tsfs]AHUDSHDI_'
>>>
希望对您有帮助。
答案 3 :(得分:0)
您可以使用2个捕获组,而在替换组中,请同时使用两个捕获组\1\2
([A-Z_]+\[[^(\s]+)[^\S\r\n]*\([A-Z]+\)[^\S\r\n]*(\][A-Z_]+)
部分
(
捕获第1组
[A-Z_]+
匹配1个以上的字符A-Z
或_
\[[^(\s]+
匹配[
并匹配1个以上所列字符以外的所有字符)
关闭群组[^\S\r\n]*
匹配除换行符外的0+个空白字符\([A-Z]+\)
在括号之间匹配字符A-Z
[^\S\r\n]*
匹配除换行符外的0+个空白字符(
捕获第2组
\][A-Z_]+
匹配]
和1个以上的字符A-Z
或_
)
关闭群组例如
import re
regex = r"([A-Z_]+\[[^(\s]+)[^\S\r\n]*\([A-Z]+\)[^\S\r\n]*(\][A-Z_]+)"
test_str = "_AHDHDUHD[Tsfs (SGYA)]AHUDSHDI_"
print(re.sub(regex, r"\1\2", test_str))
输出
_AHDHDUHD[Tsfs]AHUDSHDI_
答案 4 :(得分:0)
您正在寻找re.sub功能
import re
s = "AHDHDUHD[Tsfs (SGYA)]AHUDSHDI"
s_re = re.sub("(.*?)(\s*\(.*?\)\s*)(.*?)", '', s)
print (s_re)
它将打印:
AHDHDUHD[Tsfs]AHUDSHDI