分组正则表达式

时间:2019-10-25 04:30:25

标签: python regex

存在一个具有以下格式的文件:

FY4A-_AGRI--_N_DISK_1047E_L1-_FDI-_MULT_NOM_20191025000000_20191025001459_4000M_V0001.HDF

正则表达式具有以下形式

/^[A-Z]{2}[0-9]{1}[A-Z]{1}[-]{1}[_]{1}[A-Z]{4}[-]{2}[_]{1}[A-Z]{1}[_]{1}[A-Z]{4}[_]{1}[0-9]{4}[A-Z]{1}[_]{1}[A-Z]{1}[0-9]{1}[-]{1}[_]{1}[A-Z]{3}[-]{1}[_]{1}[A-Z]{4}[_]{1}[A-Z]{3}[_]{1}[0-9]{14}[_]{1}[0-9]{14}[_]{1}[0-9]{4}[A-Z]{1}[_]{1}[A-Z]{1}[0-9]{4}[.]{1}[A-Z]{3}$/

我如何确保所有内容都分组?

我想得到类似的东西:


(?P<ftype>[A-Z0-9]{5})      # band type of data file
            _[a-z]+                     # sat id
            _(?P<date>\d{8})           # acq date
            _(?P<time>\d{7})           # granule start time UTC
            _\d+                       # granule end time UTC
            _(?P<orbit>\d+)            # orbit number
            _\d+                       # file creation date/time
            _\w+.h5      

3 个答案:

答案 0 :(得分:1)

我可能在这里建议您只是尝试对一组定界符进行正则表达式拆分,这些定界符已用于定义模式中的组:

inp = "FY4A-_AGRI--_N_DISK_1047E_L1-_FDI-_MULT_NOM_20191025000000_20191025001459_4000M_V0001.HDF"
parts = re.split(r'[_.-]+', inp)
print(parts)

此打印:

['FY4A', 'AGRI', 'N', 'DISK', '1047E', 'L1', 'FDI', 'MULT', 'NOM', '20191025000000',
 '20191025001459', '4000M', 'V0001', 'HDF']

您可以使用常规的Python列表索引轻松访问所需的任何组。请注意,与这种冗长的正则表达式相比,此方法更干净,更易于维护。

答案 1 :(得分:1)

您可以使用MobileElement listItem=(MobileElement)driver.findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector()" + ".scrollable(true)).scrollIntoView(" + "new UiSelector().text(\"<Mention your element text value here>\"))")); 进行以下操作。

regex

输出

import re
s = 'FY4A-_AGRI--_N_DISK_1047E_L1-_FDI-_MULT_NOM_20191025000000_20191025001459_4000M_V0001.HDF'
re.findall(pattern, s)

模式在哪里:

[('FY4A',
  'AGRI',
  'N',
  'DISK',
  '1047E',
  'L1',
  'FDI',
  'MULT',
  'NOM',
  '20191025000000',
  '20191025001459',
  '4000M',
  'V0001',
  'HDF')]

答案 2 :(得分:0)

结果与以前的选项相同,但方法略有不同:

import re

inp = "FY4A-_AGRI--_N_DISK_1047E_L1-_FDI-_MULT_NOM_20191025000000_20191025001459_4000M_V0001.HDF"

inp = re.sub(r'-', '', inp)

pattern = re.findall(r'''   
                        ^([A-Z]{2}\d[A-Z])         # Comment1
                        _([A-Z]{4})                # Comment2
                        _([A-Z])                   # ...
                        _([A-Z]{4}) 
                        _(\d{4}[A-Z])
                        _([A-Z]\d)                         
                        _([A-Z]{3})                        
                        _([A-Z]{4})                        
                        _([A-Z]{3})                        
                        _(\d{8})0{6}                       
                        _(\d{8})\d{6}                      
                        _(\d{4}[A-Z])                      
                        _([A-Z]\d{4})\.([A-Z]{3})$         
                        ''', inp, re.VERBOSE)

这给了我

[('FY4A', 'AGRI', 'N', 'DISK', '1047E', 'L1', 'FDI', 'MULT', 'NOM', '20191025', '20191025', '4000M', 'V0001', 'HDF')]

然后,您可以删除一些组以仅捕获所需的部分。正如我说的那样,这不是更好,但这是将正则表达式切成小块,希望对您有所帮助