向后看正则表达式时重复

时间:2019-03-01 00:08:26

标签: regex

使用正则表达式从文件名中检索一组特定的文本时遇到问题,在下面您可以了解我的意思。

在此示例中,我有兴趣提取“ 1-2-19”。

  

28-3G__1-2-19 02252019.xlsx

从此示例中,我有兴趣提取“ 1-5-19”。

  

12H-14W_1-5-19 02252019.xlsx

从此示例中,我有兴趣提取“ 11-12-18”

  

343X-N_11-12-18.xlsx

目前我正在使用的表达式是:

(?<=_)(.*?)(?=( +[0-9]{8})?\.xlsx)

哪个返回了我想要的最后两个示例的结果,但是,对于第一个示例,它会检索“ _1-2-19”,并且多余的下划线给我带来了问题。

我尝试了不同类型的重复,但是似乎没有任何效果。任何想法将不胜感激。

这些是我尝试过但未成功的不同方法:

(?<=(_|__))(.*?)(?=( +[0-9]{8})?\.xlsx)

(?<=__?)(.*?)(?=( +[0-9]{8})?\.xlsx)

(?<=_+)(.*?)(?=( +[0-9]{8})?\.xlsx)

2 个答案:

答案 0 :(得分:1)

在第一个模式中,您使用2个捕获组,第二个捕获组(位于正向超前)包含第二个值。

请注意,(.*?)会匹配除换行符以外的所有非贪婪字符,并且不会考虑您要匹配的数字连字符模式。

您可能要做的是使用可选的非捕获组来为第三个示例匹配一个空格和8位数字,而不使用任何捕获组:

(?<=_)\d+-\d+-\d+(?=(?: \d{8})?\.xlsx\b)

说明

  • (?<=_)在肯定左边的含义是下划线
  • \d+-\d+-\d+匹配1个以上的数字连字符1个以上的数字连字符和1个以上的数字
  • (?=前瞻性断言右边是
    • (?: \d{8})?可选的非捕获组
    • \.xlsx\b匹配点后跟.xlsx并添加单词边界\b,以检查xlsx是否不是较大单词的一部分。
  • )积极回望

查看regex demo

如果您只想使用\d+-\d+-\d+之类的1-2位数字,则该模式\d{1,2}-\d{1,2}-\d{1,2}可以更具体

答案 1 :(得分:0)

尝试一下: def readMem(memId): with open(memId, "r") as rf: memVal = rf.read()

它应与示例中的日期匹配,而无需其他内容。您可以在Regex101上view your test cases with this regex

请注意,\d{1,2}\-\d{1,2}\-\d{1,2}是任何数字的令牌。