Python заменяет все вхождения, найденные с помощью регулярных выражений - PullRequest
0 голосов
/ 12 апреля 2019

В python, пытаясь заменить все вхождения строки, найденной с помощью регулярных выражений, таких как:

'10am 11pm 13am 14pm 4am'

становится

'10 am 11 pm 13 am 14 pm 4 am'

Я пытался

re.sub('([0-9].*)am(.*)', r'\1 am \2', ddata) 

Но это только заменяет последнее вхождение.

и

import re
regex = re.compile('([0-9].*)am+', re.S)
myfile =  '10am 11pm 13am 14pm 4am'
myfile2 = regex.sub(lambda m: m.group().replace(r'am',r" am ",1), myfile)
print(myfile2)

заменяет только первое вхождение 'am'

Ожидаемые результаты для меня '10 am 11pm 13 am 14pm 4 am'

Ответы [ 4 ]

1 голос
/ 12 апреля 2019

Используйте группы захвата как для цифр, так и для строки "am" или "pm", а затем просто замените пробел между группами.

import re

s = '10am 11pm 13am 14pm 4am'

subbed = re.sub(r'(\d+)([ap]m)', r'\1 \2', s)
print(subbed)
# 10 am 11 pm 13 am 14 pm 4 am
0 голосов
/ 12 апреля 2019

Это сделает работу:

import re
myfile =  '10am 11pm 13am 14pm 4am'
re.sub(r'(\d+)(am|pm)', r'\1 \2', myfile)

Вот тестовый вывод:

>>> import re
>>> myfile =  '10am 11pm 13am 14pm 4am'
>>> re.sub(r'(\d+)(am|pm)', r'\1 \2', myfile)
'10 am 11 pm 13 am 14 pm 4 am'
>>> 

РЕДАКТИРОВАТЬ: Вот вывод того же решения, касающегося строки, которую вы разместили в комментариях:

>>> import re
>>> myfile = 'The amphitheater opens at 10am-11am and 3pm-7pm'
>>> re.sub(r'(\d+)(am|pm)', r'\1 \2', myfile)
'The amphitheater opens at 10 am-11 am and 3 pm-7 pm'
>>> 
0 голосов
/ 12 апреля 2019

Вы можете сделать это, не используя re:

'10am 11pm 13am 14pm 4am'.replace('a',' a').replace('p',' p')  

## Output: '10 am 11 pm 13 am 14 pm 4 am'
0 голосов
/ 12 апреля 2019

Если вы действительно хотели получить решение с использованием регулярного выражения вместо метода простой строки replace, как упоминалось выше, вы можете использовать приведенный ниже фрагмент кода.

import re
myfile = '10am 11pm 13am 14pm 4am'
myfile2 = re.sub(r'(\d+)(am)', lambda m: '{} {}'.format(*m.groups()), myfile, 0)
print(myfile2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...