#python #regex #string
#python #регулярное выражение #строка
Вопрос:
Я хотел бы разделить строку на части, соответствующие шаблону регулярных выражений, и части, которые не соответствуют списку.
Например
import re
string = 'my_file_10'
pattern = r'd
Ответ №1:
Поместите круглые скобки вокруг шаблона, чтобы сделать его группой захвата, затем используйте re.split()
для создания списка совпадающих и несовпадающих элементов:
pattern = r'(d $)'
re.split(pattern, string)
ДЕМОНСТРАЦИЯ:
>>> import re
>>> string = 'my_file_10'
>>> pattern = r'(d $)'
>>> re.split(pattern, string)
['my_file_', '10', '']
Поскольку вы разделяете цифры в конце строки, включается пустая строка.
Если вы ожидаете только одно совпадение в конце строки (которое $
в вашем шаблоне приведено здесь), тогда просто используйте m.start()
метод для получения индекса для нарезки входной строки:
pattern = r'd
Это возвращает:
>>> pattern = r'd
Комментарии:
1. Это определенно отвечает на первоначальный вопрос. Теперь мне интересно, каким был бы питонический способ выяснить, какие элементы в результирующем списке совпадают, а какие нет. Мне это было бы нужно, и сопоставление каждого элемента для проверки кажется более чем немного неуклюжим.
Ответ №2:
Вы можете использовать re.split
для составления списка этих отдельных совпадений и использовать filter
, который отфильтровывает все элементы, которые считаются ложными ( пустые строки ).
>>> import re
>>> filter(None, re.split(r'(d $)', 'my_file_015_01'))
['my_file_015_', '01']
Комментарии:
1. хорошая идея, но мне нужно что-то, что состоит только из двух частей. Например, если строка 'my_file_015_01', ваше решение выдаст ['my_file_', '015', '_', '01']. Это усложняет работу в моем коде. Ответ Мартинна подходит лучше.
2. @user1850133 Обновленный ответ
# I know the matching pattern can be obtained with :
m = re.search(pattern, string).group()
print m
'10'
# The final result should be as following
['my_file_', '10']
Ответ №1:
Поместите круглые скобки вокруг шаблона, чтобы сделать его группой захвата, затем используйте re.split()
для создания списка совпадающих и несовпадающих элементов:
ДЕМОНСТРАЦИЯ:
Поскольку вы разделяете цифры в конце строки, включается пустая строка.
Если вы ожидаете только одно совпадение в конце строки (которое $
в вашем шаблоне приведено здесь), тогда просто используйте m.start()
метод для получения индекса для нарезки входной строки:
Это возвращает:
Комментарии:
1. Это определенно отвечает на первоначальный вопрос. Теперь мне интересно, каким был бы питонический способ выяснить, какие элементы в результирующем списке совпадают, а какие нет. Мне это было бы нужно, и сопоставление каждого элемента для проверки кажется более чем немного неуклюжим.
Ответ №2:
Вы можете использовать re.split
для составления списка этих отдельных совпадений и использовать filter
, который отфильтровывает все элементы, которые считаются ложными ( пустые строки ).
Комментарии:
1. хорошая идея, но мне нужно что-то, что состоит только из двух частей. Например, если строка 'my_file_015_01', ваше решение выдаст ['my_file_', '015', '_', '01']. Это усложняет работу в моем коде. Ответ Мартинна подходит лучше.
2. @user1850133 Обновленный ответ
match = re.search(pattern, string)
not_matched, matched = string[:match.start()], match.group()
Это возвращает:
Комментарии:
1. Это определенно отвечает на первоначальный вопрос. Теперь мне интересно, каким был бы питонический способ выяснить, какие элементы в результирующем списке совпадают, а какие нет. Мне это было бы нужно, и сопоставление каждого элемента для проверки кажется более чем немного неуклюжим.
Ответ №2:
Вы можете использовать re.split
для составления списка этих отдельных совпадений и использовать filter
, который отфильтровывает все элементы, которые считаются ложными ( пустые строки ).
Комментарии:
1. хорошая идея, но мне нужно что-то, что состоит только из двух частей. Например, если строка 'my_file_015_01', ваше решение выдаст ['my_file_', '015', '_', '01']. Это усложняет работу в моем коде. Ответ Мартинна подходит лучше.
2. @user1850133 Обновленный ответ
# I know the matching pattern can be obtained with :
m = re.search(pattern, string).group()
print m
'10'
# The final result should be as following
['my_file_', '10']
Ответ №1:
Поместите круглые скобки вокруг шаблона, чтобы сделать его группой захвата, затем используйте re.split()
для создания списка совпадающих и несовпадающих элементов:
ДЕМОНСТРАЦИЯ:
Поскольку вы разделяете цифры в конце строки, включается пустая строка.
Если вы ожидаете только одно совпадение в конце строки (которое $
в вашем шаблоне приведено здесь), тогда просто используйте m.start()
метод для получения индекса для нарезки входной строки:
Это возвращает:
Комментарии:
1. Это определенно отвечает на первоначальный вопрос. Теперь мне интересно, каким был бы питонический способ выяснить, какие элементы в результирующем списке совпадают, а какие нет. Мне это было бы нужно, и сопоставление каждого элемента для проверки кажется более чем немного неуклюжим.
Ответ №2:
Вы можете использовать re.split
для составления списка этих отдельных совпадений и использовать filter
, который отфильтровывает все элементы, которые считаются ложными ( пустые строки ).
Комментарии:
1. хорошая идея, но мне нужно что-то, что состоит только из двух частей. Например, если строка ‘my_file_015_01’, ваше решение выдаст [‘my_file_’, ‘015’, ‘_’, ’01’]. Это усложняет работу в моем коде. Ответ Мартинна подходит лучше.
2. @user1850133 Обновленный ответ
>>> match = re.search(pattern, string)
>>> string[:match.start()], match.group()
(‘my_file_’, ’10’)
Комментарии:
1. Это определенно отвечает на первоначальный вопрос. Теперь мне интересно, каким был бы питонический способ выяснить, какие элементы в результирующем списке совпадают, а какие нет. Мне это было бы нужно, и сопоставление каждого элемента для проверки кажется более чем немного неуклюжим.
Ответ №2:
Вы можете использовать re.split
для составления списка этих отдельных совпадений и использовать filter
, который отфильтровывает все элементы, которые считаются ложными ( пустые строки ).
Комментарии:
1. хорошая идея, но мне нужно что-то, что состоит только из двух частей. Например, если строка ‘my_file_015_01’, ваше решение выдаст [‘my_file_’, ‘015’, ‘_’, ’01’]. Это усложняет работу в моем коде. Ответ Мартинна подходит лучше.
2. @user1850133 Обновленный ответ
# I know the matching pattern can be obtained with :
m = re.search(pattern, string).group()
print m
’10’
# The final result should be as following
[‘my_file_’, ’10’]
Ответ №1:
Поместите круглые скобки вокруг шаблона, чтобы сделать его группой захвата, затем используйте re.split()
для создания списка совпадающих и несовпадающих элементов:
ДЕМОНСТРАЦИЯ:
Поскольку вы разделяете цифры в конце строки, включается пустая строка.
Если вы ожидаете только одно совпадение в конце строки (которое $
в вашем шаблоне приведено здесь), тогда просто используйте m.start()
метод для получения индекса для нарезки входной строки:
Это возвращает:
Комментарии:
1. Это определенно отвечает на первоначальный вопрос. Теперь мне интересно, каким был бы питонический способ выяснить, какие элементы в результирующем списке совпадают, а какие нет. Мне это было бы нужно, и сопоставление каждого элемента для проверки кажется более чем немного неуклюжим.
Ответ №2:
Вы можете использовать re.split
для составления списка этих отдельных совпадений и использовать filter
, который отфильтровывает все элементы, которые считаются ложными ( пустые строки ).
Комментарии:
1. хорошая идея, но мне нужно что-то, что состоит только из двух частей. Например, если строка ‘my_file_015_01’, ваше решение выдаст [‘my_file_’, ‘015’, ‘_’, ’01’]. Это усложняет работу в моем коде. Ответ Мартинна подходит лучше.
2. @user1850133 Обновленный ответ
match = re.search(pattern, string)
not_matched, matched = string[:match.start()], match.group()Это возвращает:
Комментарии:
1. Это определенно отвечает на первоначальный вопрос. Теперь мне интересно, каким был бы питонический способ выяснить, какие элементы в результирующем списке совпадают, а какие нет. Мне это было бы нужно, и сопоставление каждого элемента для проверки кажется более чем немного неуклюжим.
Ответ №2:
Вы можете использовать re.split
для составления списка этих отдельных совпадений и использовать filter
, который отфильтровывает все элементы, которые считаются ложными ( пустые строки ).
Комментарии:
1. хорошая идея, но мне нужно что-то, что состоит только из двух частей. Например, если строка ‘my_file_015_01’, ваше решение выдаст [‘my_file_’, ‘015’, ‘_’, ’01’]. Это усложняет работу в моем коде. Ответ Мартинна подходит лучше.
2. @user1850133 Обновленный ответ
# I know the matching pattern can be obtained with :
m = re.search(pattern, string).group()
print m
’10’
# The final result should be as following
[‘my_file_’, ’10’]
Ответ №1:
Поместите круглые скобки вокруг шаблона, чтобы сделать его группой захвата, затем используйте re.split()
для создания списка совпадающих и несовпадающих элементов:
ДЕМОНСТРАЦИЯ:
Поскольку вы разделяете цифры в конце строки, включается пустая строка.
Если вы ожидаете только одно совпадение в конце строки (которое $
в вашем шаблоне приведено здесь), тогда просто используйте m.start()
метод для получения индекса для нарезки входной строки:
Это возвращает:
Комментарии:
1. Это определенно отвечает на первоначальный вопрос. Теперь мне интересно, каким был бы питонический способ выяснить, какие элементы в результирующем списке совпадают, а какие нет. Мне это было бы нужно, и сопоставление каждого элемента для проверки кажется более чем немного неуклюжим.
Ответ №2:
Вы можете использовать re.split
для составления списка этих отдельных совпадений и использовать filter
, который отфильтровывает все элементы, которые считаются ложными ( пустые строки ).
Комментарии:
1. хорошая идея, но мне нужно что-то, что состоит только из двух частей. Например, если строка ‘my_file_015_01’, ваше решение выдаст [‘my_file_’, ‘015’, ‘_’, ’01’]. Это усложняет работу в моем коде. Ответ Мартинна подходит лучше.
2. @user1850133 Обновленный ответ