使用python中的正则表达式分割字符串的某些部分

时间:2019-12-11 12:45:10

标签: python regex python-regex

我有不同的字符串,形式为_AHDHDUHD[Tsfs (SGYA)]AHUDSHDI_,我想删去(SGYA)部分(始终用大括号括起来)和最后一个空格。因此结果应为_AHDHDUHD[Tsfs]AHUDSHDI_

我的想法是将方括号的内容与([A-Z_])(\[.+\])([A-Z_])匹配,然后进行拆分,然后使用re模块将其重新插入(尽管我不确定哪个re功能适用于此)。

但是,这感觉不佳。是否有regex可以直接执行我想要的操作,而无需中介步骤?

5 个答案:

答案 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+个字符,然后是]

Python demo

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

请参见another Python demo

在这里,\[[^][]+]模式将找到[的所有块,然后是除方括号之外的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_
  • )关闭群组

Regex demo | Python demo

例如

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