python возвращает совпадающие и несовпадающие шаблоны строк

#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 Обновленный ответ