Regex, чтобы поймать основное имя файла - PullRequest
0 голосов
/ 26 апреля 2018

Я застрял на регулярном выражении, чтобы поймать основное имя файла в элементах списка.Предположим, у меня есть список filepath:

path_list = ['/Users/buggylines/histogram/offline-deployer-list_b7bacc7fdb-0e0e08077c_GERONIMO-2886_635_histogrambuglines_635.diff',
             '/Users/buggylines/histogram/normal.jsp_aa0c2c26dd-90188cc2a4_GERONIMO-4597_1293_histogrambuglines_1293.diff',
             '/Users/buggylines/histogram/hbase-env.sh_aa0c2c26dd-90188cc2a4_GERONIMO-4597_1293_histogrambuglines_1293.diff',
             '/Users/buggylines/histogram/LICENSE-tesh_cd1ec17e43-4ebc5e8021_GERONIMO-5702_1573_histogrambuglines_785.diff',
             '/Users/buggylines/histogram/geronimo_dcce59ae71-8f5c1aa7a1_GERONIMO-5661_1554_histogrambuglines_54.diff',
             '/Users/buggylines/histogram/catalina-6.0.18-G678601.jar.sha1_cd1ec17e43-4ebc5e8021_GERONIMO-5702_1573_histogrambuglines_785.diff',
             '/Users/buggylines/histogram/geronimo-naming-1.0.xsd_544dee5179-40a2ae1d41_GERONIMO-1027_131_histogrambuglines_131.diff',
             '/Users/buggylines/histogram/6.0.18-G678601.README.TXT_cd1ec17e43-4ebc5e8021_GERONIMO-5702_1573_histogrambuglines_785.diff'
            ]

Я хочу захватить только имя файла, используя regex.Мне нужен следующий вывод:

expected_output = ['offline-deployer-list',
                   'normal.jsp',
                   'hbase-env.sh',
                   'LICENSE-tesh',
                   'geronimo',
                   'catalina-6.0.18-G678601.jar.sha1',
                   'geronimo-naming-1.0.xsd',
                   '6.0.18-G678601.README.TXT'
                  ]

Это код, который я написал:

filename = []
for z, path in enumerate(path_list):
     pattern = re.search("((?:\w+[-]\w+[-]\w+|\w+[-]\w+|\w+)[.]\w+[_])|(?<=histogram/)(?:\w+[-]\w+[-]\D+[_]|\D+[-]\w+[_])|(?<=histogram\/)(\w+[_])(?<=[_])", path)
     pattern = pattern.groups()
     filename.append(pattern[0])

Однако вывод не тот, который я ожидал.Это вывод кода:

filename = [None,
            'normal.jsp_',
            'hbase-env.sh_',
            None,
            None,
            'jar.sha1_',
            '0.xsd_',
            'README.TXT_']

Мне нужна помощь, чтобы исправить регулярное выражение.Большое вам спасибо.

Ответы [ 5 ]

0 голосов
/ 26 апреля 2018

Это очень питонное решение.

import re

path_list = ['/Users/buggylines/histogram/offline-deployer-list_b7bacc7fdb-0e0e08077c_GERONIMO-2886_635_histogrambuglines_635.diff',
         '/Users/buggylines/histogram/normal.jsp_aa0c2c26dd-90188cc2a4_GERONIMO-4597_1293_histogrambuglines_1293.diff',
         '/Users/buggylines/histogram/hbase-env.sh_aa0c2c26dd-90188cc2a4_GERONIMO-4597_1293_histogrambuglines_1293.diff',
         '/Users/buggylines/histogram/LICENSE-tesh_cd1ec17e43-4ebc5e8021_GERONIMO-5702_1573_histogrambuglines_785.diff',
         '/Users/buggylines/histogram/geronimo_dcce59ae71-8f5c1aa7a1_GERONIMO-5661_1554_histogrambuglines_54.diff',
         '/Users/buggylines/histogram/catalina-6.0.18-G678601.jar.sha1_cd1ec17e43-4ebc5e8021_GERONIMO-5702_1573_histogrambuglines_785.diff',
         '/Users/buggylines/histogram/geronimo-naming-1.0.xsd_544dee5179-40a2ae1d41_GERONIMO-1027_131_histogrambuglines_131.diff',
         '/Users/buggylines/histogram/6.0.18-G678601.README.TXT_cd1ec17e43-4ebc5e8021_GERONIMO-5702_1573_histogrambuglines_785.diff'
        ]


filename_re = re.compile(r'^\/Users\/buggylines\/histogram\/(?P<filename>[A-Za-z0-9-.]+)_')

filename = []
for item in path_list:
    filename_match = filename_re.search(item)
    if filename_match:
         filename.append(filename_match.group('filename'))

print(filename)
0 голосов
/ 26 апреля 2018
import re
path_list = ['/Users/buggylines/histogram/offline-deployer-list_b7bacc7fdb-0e0e08077c_GERONIMO-2886_635_histogrambuglines_635.diff',
             '/Users/buggylines/histogram/normal.jsp_aa0c2c26dd-90188cc2a4_GERONIMO-4597_1293_histogrambuglines_1293.diff',
             '/Users/buggylines/histogram/hbase-env.sh_aa0c2c26dd-90188cc2a4_GERONIMO-4597_1293_histogrambuglines_1293.diff',
             '/Users/buggylines/histogram/LICENSE-tesh_cd1ec17e43-4ebc5e8021_GERONIMO-5702_1573_histogrambuglines_785.diff',
             '/Users/buggylines/histogram/geronimo_dcce59ae71-8f5c1aa7a1_GERONIMO-5661_1554_histogrambuglines_54.diff',
             '/Users/buggylines/histogram/catalina-6.0.18-G678601.jar.sha1_cd1ec17e43-4ebc5e8021_GERONIMO-5702_1573_histogrambuglines_785.diff',
             '/Users/buggylines/histogram/geronimo-naming-1.0.xsd_544dee5179-40a2ae1d41_GERONIMO-1027_131_histogrambuglines_131.diff',
             '/Users/buggylines/histogram/6.0.18-G678601.README.TXT_cd1ec17e43-4ebc5e8021_GERONIMO-5702_1573_histogrambuglines_785.diff'
            ]

for i in path_list:
    s = re.search(r"\/\w+\/\w+\/\w+\/([^_/]+)", i)
    if s:
        print(s.group(1))

Выход:

offline-deployer-list
normal.jsp
hbase-env.sh
LICENSE-tesh
geronimo
catalina-6.0.18-G678601.jar.sha1
geronimo-naming-1.0.xsd
6.0.18-G678601.README.TXT
0 голосов
/ 26 апреля 2018

Вот один, который работает для меня:

((?<=histogram\/)[a-zA-Z0-9-.]+(?=_))

Проверьте это здесь https://regex101.com/r/VfQIJC/4

Обновление

Более общий, который соответствуетмежду последним / и первым _ после этого:

((?<=\/)[a-zA-Z0-9-.]+(?!.+\/)(?=_))

https://regex101.com/r/VfQIJC/5

0 голосов
/ 26 апреля 2018

Вы можете использовать os.path.basename примерно так:

import os

path_list = ['/Users/buggylines/histogram/offline-deployer-list_b7bacc7fdb-0e0e08077c_GERONIMO-2886_635_histogrambuglines_635.diff',
         '/Users/buggylines/histogram/normal.jsp_aa0c2c26dd-90188cc2a4_GERONIMO-4597_1293_histogrambuglines_1293.diff',
         '/Users/buggylines/histogram/hbase-env.sh_aa0c2c26dd-90188cc2a4_GERONIMO-4597_1293_histogrambuglines_1293.diff',
         '/Users/buggylines/histogram/LICENSE-tesh_cd1ec17e43-4ebc5e8021_GERONIMO-5702_1573_histogrambuglines_785.diff',
         '/Users/buggylines/histogram/geronimo_dcce59ae71-8f5c1aa7a1_GERONIMO-5661_1554_histogrambuglines_54.diff',
         '/Users/buggylines/histogram/catalina-6.0.18-G678601.jar.sha1_cd1ec17e43-4ebc5e8021_GERONIMO-5702_1573_histogrambuglines_785.diff',
         '/Users/buggylines/histogram/geronimo-naming-1.0.xsd_544dee5179-40a2ae1d41_GERONIMO-1027_131_histogrambuglines_131.diff',
         '/Users/buggylines/histogram/6.0.18-G678601.README.TXT_cd1ec17e43-4ebc5e8021_GERONIMO-5702_1573_histogrambuglines_785.diff'
        ]

output = [os.path.basename(path).split('_')[0] for path in path_list]    

print(output)

Выход:

['offline-deployer-list', 'normal.jsp', 'hbase-env.sh', 'LICENSE-tesh', 'geronimo', 'catalina-6.0.18-G678601.jar.sha1', 'geronimo-naming-1.0.xsd', '6.0.18-G678601.README.TXT']
0 голосов
/ 26 апреля 2018

почему бы не использовать сплит?

>>> list = [x.split("/")[-1].split("_")[0] for x in path_list]
>>> list
['offline-deployer-list', 'normal.jsp', 'hbase-env.sh', 'LICENSE-tesh', 'geronimo', 'catalina-6.0.18-G678601.jar.sha1', 'geronimo-naming-1.0.xsd', '6.0.18-G678601.README.TXT']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...