我在Python中有一个带有值的列表

['JUL_2018', 'AUG_2018', 'SEP_2018', 'OCT_2018', 'NOV_2018', 'DEC_2018', 'JAN_2019', 'FEB_2019', 'MAR_2019', 'APR_2019', 'MAY_2019', 'JUN_2019', 'MAT_YA_1', 'MAT_TY_1', 'YTD_YA_1', 'YTD_TY_1', 'L3M_YA_1', 'L1M_YA_1']

我只想匹配长度为8,下划线前有3个字符,下划线后有4位数字的字符串,因此我消除了不需要的值。 我只对上面列表中的MMM_YYYY值感兴趣。

在下面尝试过,我无法过滤具有多个下划线的YTD_TY_1值。

        for c in col_headers:
            d= (re.match('^(?=.*\d)(?=.*[A-Z0-9])[A-Z_0-9\d]{8}$',c))
            if d:
                data_period.append(d[0])

#1楼 票数:0 已采纳

更新:基于@WiktorStribiżew的观察,即re.match在Python中不需要完全字符串匹配

我使用的正则表达式基于@dvo在评论中提供的正则表达式:

import re

REGEX = '^[A-Z]{3}_[0-9]{4}$'
col_headers = ['JUL_2018', 'AUG_2018', 'SEP_2018', 'OCT_2018', 'NOV_2018', 'DEC_2018', 'JAN_2019', 'FEB_2019', 'MAR_2019', 'APR_2019', 'MAY_2019', 'JUN_2019', 'MAT_YA_1', 'MAT_TY_1', 'YTD_YA_1', 'YTD_TY_1', 'L3M_YA_1', 'L1M_YA_1']
regex = re.compile(REGEX)
data_period = list(filter(regex.search, col_headers))

再次根据@WiktorStribiżew的评论,如果您不想匹配"SXX_0012""XYZ_0000" ,则应使用他在评论中提供的正则表达式:

REGEX = r'^(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)-[0-9]{4}$'

#2楼 票数:0

而不是使用正则表达式,您应该首先尝试将其解析为日期:

from datetime import datetime
date_fmt = "%b_%Y"
for c in col_headers:
    try:
        d = datetime.strptime(c, date_fmt)
        data_period.append(c) # Or just save the datetime object directly
    except ValueError:
        pass

#3楼 票数:0

该代码中实际上在您的解决方案中进行匹配的部分是

[A-Z_0-9\d]{8}

问题是您要查找正好包括AZ_0-9\\d 8个字符。 现在, \\d等于0-9 ,因此您可以消除它,但这并不能解决整个问题,这里的问题是,您已经将整个解决方案都放在了方括号[] 基本上,您的字符串将匹配长度为8个字符的任何字符,并且包括上述字符,即:A_19_KJ9

您需要做的是指定要精确地输入3个AZ字符,然后是单个_ ,然后是4 \\d ,请参见下文:

[A-Z]{3}_\d{4}

这将匹配所有具有3个AZ字符的字符,然后是一个_ ,然后是4 \\d (任何数字)

为了更好地了解regex,建议您使用regex101等在线工具

  ask by 0tKali translate from so

未解决问题?本站智能推荐:

1回复

匹配数字和字母以及特定长度的字符串

所以我有这个练习,无法解决它: 我只能接受一个字符串,如果它由数字和字母构成,则必须至少包含其中一个字符串; 它必须是6-8个字符长。 字符串只有一个字。 第一部分很好,虽然我不确定使用匹配: 但我不知道如何指定长度应该是加起来的数字和字母的长度。 这不起作用,我想不管怎么说:
1回复

特定长度的字符和数字组合的正则表达式[重复]

这个问题在这里已经有了答案: 限制正则​​表达式中的字符长度1 个回答 1 年前关闭。 我试图找到一个匹配字母和数字组合的正则表达式,每种类型必须至少出现一
2回复

正则表达式:匹配多个固定长度

我只需要匹配那些以5开头且长度恰好为4位数的数字。 这是我的正则表达式模式: 我得到的是:5560、5511 因此,5511不应成为输出的一部分,因为它只是55110的子字符串,而不是整数。
3回复

如何从python中的字符串中提取一定长度的数字?[重复]

这个问题在这里已经有了答案: 正则表达式匹配未用数字括起来的 5 位子字符串(2 个回答) 8 个月前关闭。 我有一个看起来像这样的数据框: 我想提取数字
3回复

如何在Python中搜索特定长度的字母数字子字符串?

说我有一个字符串“ ldhjshjds HdAjhdshj4 Hdsshj4 kdskjdshjdsjds” 我只想搜索以“ H”开头的子字符串(仅字母数字),但前提是该字符串介于10到20个字符之间。 “ HdAjhdshj4”将是一个匹配项。 “ Hdsshj4”不会。 这样的
3回复

正则表达式-字符串和第一次出现之间的Python匹配

无论我读了多少文档,我都很难掌握正则表达式。 我正在尝试匹配一个字符串和第一次出现之间的所有内容&这就是我所拥有的 我正在使用https://regex101.com/#python来帮助我验证我的正则表达式,我可以得到rex = re.compile("user_group.do
3回复

正则表达式以匹配特定长度的数字

我想匹配一个15位数字(作为较大的正则表达式字符串的一部分)。 现在,我有 但我觉得必须有一种更清洁的方法来做到这一点。
5回复

如何在Python中最后一次出现非数字字符后获取所有数字

说我有琴弦 100D555 如何在python中拆分此字符串,使其最后只剩下“ 555”? 我操作的字符串大致遵循相同的格式:x个数字,后跟一个非数字char,然后z个数字。 另一个例子: 10M4567在这种情况下,我需要“ 4567”