【问题标题】:Find 1 letter and 2 numbers using RegEx使用 RegEx 查找 1 个字母和 2 个数字
【发布时间】:2013-11-15 14:13:25
【问题描述】:

我最近一直在编写一个程序,其中一部分需要我在字符串中获取信息形式。我需要找到 1 个字母后跟 2 个数字(例如 S07)的位置,但我无法计算出它的 RegEx。

def get_season(filenames):
    pattern = "^[a-zA-z]{1}[\d]{2}$"
    found = re.search(filenames[0], pattern)
    season_name = found.string
    season = season_name[1:3]
    print(season)

我知道此信息在字符串中,但它一直给我“无”作为响应

(我不太确定代码部分的格式是否正确,在预览中显示为同一行,但我的程序中的缩进是正确的)

【问题讨论】:

  • s/a-zA-z/a-zA-Z/;将[\d] 更改为\d
  • @devnull:这个范围太宽了,不是太窄。 [..] 类只是多余的,它不会匹配任何更少的东西。
  • @MartijnPieters 我的意思是 替代 a-zA-za-zA-Z
  • @devnull:是的,我明白这很好(我是一个 VI 用户,在过去的一生中编写过 Perl)。我是说A-z 仍然包括A-Z,以及Za 之间的所有内容,然后一直到z

标签: python regex python-3.x


【解决方案1】:

您将参数交换为re.search()。第一个参数是模式,而不是要匹配的字符串:

found = re.search(pattern, filenames[0])

你的图案也太宽了; A-z 也匹配Z(大写)和a(小写)之间的所有内容。正确的模式是:

pattern = "^[a-zA-Z]\d{2}$"

{1} 是默认值,所以我省略了。

如果您将其与文件名进行匹配,您可能不想使用开始或结束锚点,这会将匹配限制为精确字符串

>>> re.search("^[a-zA-Z]\d{2}$", "S07").string
'S20'
>>> re.search("^[a-zA-Z]\d{2}$", "S07E01 - Meet the New Boss.avi") is None
True
>>> re.search("^[a-zA-Z]\d{2}$", "S07E01 - Meet the New Boss.avi") is None
True
>>> re.search("[a-zA-Z]\d{2}", "S07E01 - Meet the New Boss.avi").string
'S07E01 - Meet the New Boss.avi'

并且您想使用.group() 来获取匹配部分,而不是string(这是原始输入字符串):

>>> re.search("[a-zA-Z]\d{2}", "S07E01 - Meet the New Boss.avi").group()
'S07'

如果您只想要 数字,您需要添加一个组,然后选择它。您创建一个带括号的捕获组:

>>> re.search("[a-zA-Z](\d{2})", "S07E01 - Meet the New Boss.avi").group(1)
'07'

这将选择第一组 (.group(1)),即 2 位数字部分的括号。

【讨论】:

    【解决方案2】:

    您的正则表达式将仅捕获仅由一个字母和两个数字组成的字符串,以检查整个字符串是否出现多次使用这些:

    试试这个正则表达式:

    [a-zA-Z]\d{2}
    

    输入

    asdasdasS01asfasfsa

    输出

    S01

    如果您想查找仅由一个字母后跟两位数字组成的单词,请使用此正则表达式:

    \b[a-zA-Z]\d{2}\b
    

    只有数字捕获正则表达式:

    [a-zA-Z](\d{2})
    

    输入

    asdasdasS01asfasfsa

    输出

    01




    还要交换 serach 方法中的参数。

    【讨论】:

    • 字符串是“S07E01 - Meet the New Boss.avi”,这是一个电视节目的剧集标题,我试图挑出 S 和 E 之间的部分
    • @user2099020 所以你只想要数字?如果是,我已经在我的答案中添加了第三个正则表达式。
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多