Python 使用正则表达式仅保留特殊字符串

Python 使用正则表达式仅保留特殊字符串,python,regex,Python,Regex,给定一个python字符串,我只想保留由该模式组成的子字符串:任意两个字符+下划线+任意四个字符。例如,如果我有这个字符串AX_45TH(23)-JK_I KL_9056,我只想得到AX_45TH和KL_9056 其他几个输入和预期输出示例: 输入:“12米(蓝色),红色YU米6” 输出:[“12_MKTY”,“YU_MKT6”] 输入:“12_MKT(蓝色),红色YU_MKT6” 输出:[“YU_MKT6”] 输入:“12米(蓝色),红色YU_MKT6” 输出:[“YU_MKT6”]列表 >>

给定一个python字符串,我只想保留由该模式组成的子字符串:任意两个字符+下划线+任意四个字符。例如,如果我有这个字符串
AX_45TH(23)-JK_I KL_9056
,我只想得到
AX_45TH
KL_9056

其他几个输入和预期输出示例:

输入:
“12米(蓝色),红色YU米6”
输出:
[“12_MKTY”,“YU_MKT6”]

输入:
“12_MKT(蓝色),红色YU_MKT6”
输出:
[“YU_MKT6”]

输入:
“12米(蓝色),红色YU_MKT6”
输出:
[“YU_MKT6”]

列表

>>重新导入
>>>
>>>
>>>pat=re.compile(“[0-9A-Za-z]{2}{[0-9A-Za-z]{4}”)
>>>
>>>对于[“AX_45(23)-JK_I KL_9056”、“12_MKTY(蓝色)、红色YU_MKT6”、“12_MKT(蓝色)、红色YU_MKT6”、“12_M(蓝色)、红色YU_MKT6”中的文本:
...     打印(“{0:s}:{1:}”。格式(text,pat.findall(text)))
...
第45(23)条-JK_I KL_9056:['AX_45','KL_9056']
12_MKTY(蓝色),红色YU_MKT6:['12_MKTY','YU_MKT6']
12_MKT(蓝色),红色YU_MKT6:['YU_MKT6']
12μM(蓝色),红色YU_MKT6:['YU_MKT6']
  • [A-Za-z0-9]
    将匹配任何字母或数字
  • {4} 恰好匹配前一组或前一个字符的四个重复
考虑到这一点,这将实现以下目的:

import re

my_strings = ["AX_45TH (23) - JK_I KL_9056",
             "12_MKTY (BLUE), RED YU_MKT6",
             "12_MKT (BLUE), RED YU_MKT6",
             "12_M (BLUE), RED YU_MKT6"]

matches = []
for s in my_strings:
    matches.append(re.findall(r'[A-Za-z0-9]{2}_[A-Za-z0-9]{4}', s))

print(matches)
产出:

[['AX_45TH', 'KL_9056'], ['12_MKTY', 'YU_MKT6'], ['YU_MKT6'], ['YU_MKT6']]

我总是使用正则表达式原型。

您在哪里遇到问题?@Sushanth谢谢,但是如果输入是
AX\u 45TH(23)-JK\u I89 KL\u 9056如何。与您的解决方案一起返回的还有
JK_I89
。@Brian请用一些示例输入和预期输出更新您的问题。findall(“\b\w\w\w\w\w\b”,x)当然,假设“任意字符”指的是“任意单词字符”
/w
。您的图案将与“U_______MKTY”匹配<代码>/w
匹配任何字母、数字或下划线。相当于
[a-zA-Z0-9.]
@Ian:谢谢,我知道,问题中没有明确说明(“任何两个字符”)。然后我重新访问了初始字符串,根据预期的输出,它不应该匹配下划线。更正了代码。