Один регер linex для извлечения двух наборов чисел из строки

#python #regex

Вопрос:

Цель состоит в извлечении number из строки.

Этого можно легко достичь с помощью split

 s='/mnt/d/datat/ssome_part - Copy/s14_060319m.set.zip'

n=s.split('Copy/')[1].split('set')[0].split('_')
sbj=n[0]
sub=n[1]
 

которые производят

 sbj = {str} 's14'
sub = {str} '060319m.'
 

Пожалуйста, обратите внимание на префикс m sub . Это уникально для разных случаев.

Текущее предложение позволяет мне использовать заглавную s букву , такую как BBarmar sbj=’S’ sbj

Но я изо всех сил пытаюсь применить это regex . И выполнение описанных ниже действий не привело к желаемому результату

 m = re.findall(r'%s(d )', s)
 

Комментарии:

1. %s В вашей строке нет, что это должно означать в регулярном выражении?

2. Просто используйте r'd '

3. За s то, что было незадолго до 14 этого .

4. А как насчет % этого ?

5. s Перед вторым номером нет, так что он будет соответствовать только первому номеру.

Ответ №1:

Просто используйте регулярное d выражение для сопоставления чисел.

Чтобы соответствовать s префиксу или m суффиксу, используйте альтернативы с. |

 sbj, sub = re.findall(r'sd |d m', s)
 

Комментарии:

1. Спасибо за предложение @Barмар. Могу я узнать, как включить m это в sub вывод? В настоящее время он удален. Вместо 060319 того , чтобы я хотел бы, чтобы это было 060319m так .

2. И вы также хотите s , чтобы в sbj выводе было?

3. Вы могли бы использовать r'sd |d m'

4. Где в вопросе говорится, что вам нужны письма?

5. Я обновлю вопрос, чтобы отразить это. Я раньше не задумывался об этом вопросе

Ответ №2:

Воспользуйся

 import re
s='/mnt/d/datat/ssome_part - Copy/s14_060319m.set.zip'
match = re.search(r'(w )_(w )[^/]*

Видеть Доказательство Python | доказательство регулярных выражений.

объяснение

 --------------------------------------------------------------------------------
  (                        group and capture to 1:
--------------------------------------------------------------------------------
    w                       word characters (a-z, A-Z, 0-9, _) (1 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of 1
--------------------------------------------------------------------------------
  _                        '_'
--------------------------------------------------------------------------------
  (                        group and capture to 2:
--------------------------------------------------------------------------------
    w                       word characters (a-z, A-Z, 0-9, _) (1 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of 2
--------------------------------------------------------------------------------
  [^/]*                    any character except: '/' (0 or more times
                           (matching the most amount possible))
--------------------------------------------------------------------------------
  $                        before an optional n, and the end of the
                           string
 

Ответ №3:

Если вы хотите, только num_num попробуйте это:

 s='/mnt/d/datat/ssome_part - Copy/s14_060319m.set.zip'
re.findall(r'd _d ', s)[0].split('_')
# ['14', '060319']
 

Или если у вас, возможно, есть несколько чисел, лучше получить список тупиц, как показано ниже:

 s='/mnt/d/datat/ssome20_part10 - Copy/s14_060319m.set.zip'
lst_num = re.findall(r'd ', s)
lst_num
# ['20', '10', '14', '060319']
 

Ответ №4:

Или просто так:

 >>> sbj, sub = re.findall('[0-9] ', s)
>>> sbj
'14'
>>> sub
'060319'
>>> 
 

, s)
if match is not None:
print(match.group(1).upper())
print(match.group(2))
Видеть Доказательство Python | доказательство регулярных выражений.

объяснение


Ответ №3:

Если вы хотите, только num_num попробуйте это:


Или если у вас, возможно, есть несколько чисел, лучше получить список тупиц, как показано ниже:


Ответ №4:

Или просто так: