#python #string
#питон #строка #python
Вопрос:
Я пытаюсь взять строку типа «PR405j» и разделить ее на две строки. В этом случае двумя строками будут «PR» и «405j». Существует множество строк, с которыми я должен это сделать. Примеры: «ACR498» будет «ACR» и «498», «FR707e» будет «FR» и «707e», «TY699l» будет «TY» и «699l» и так далее, и тому подобное.
Проблема, с которой я столкнулся, заключается в отделении первой части от второй. Количество символов с обеих сторон различается, и вторая строка (та, что с цифрами) также может содержать или не содержать буквенные символы. Единственная общность между всеми этими строками заключается в том, что вы можете разделить их на основе первого экземпляра целого числа.
Я думал, что цикл for, который проходит через каждый символ в исходной строке и создает две отдельные строки внутри, будет работать, но я мог думать только о том, чтобы основывать разделение на целых числах и буквенных символах, что сделало бы что-то вроде «PR405j» превращенным в «PRj» и «405».
Я также думал, что метод разделения строк поможет, но нет ни одного символа, который был бы общим для всех этих строк.
Наконец, я не могу разделить строки на основе количества буквенных символов в начале строки (скажем, 2 для «PR405j»), потому что между строками есть различия.
Если бы кто-нибудь мог помочь мне с этим, я был бы очень признателен. Спасибо!
Комментарии:
1.
re
Было бы''.join(itertools.takewhile(operator.methodcaller('isalpha'), thestring)), ''.join(itertools.dropwhile(operator.methodcaller('isalpha'), thestring))
альтернативой, но не используйте это.2. И что вы хотите, чтобы произошло, если (1) строка не начинается ни с одного алфавита (2) за буквами не следуют никакие цифры?
Ответ №1:
Вы можете использовать регулярные выражения для выполнения простого сопоставления строк, такого как это. Выражение ‘(D )(. )’ гласит ‘Извлеките одну или несколько нецифровых строк в качестве первой группы, затем извлеките один или несколько других символов в качестве второй.’
import re
inputs = ['PR405j']
for input in inputs:
match = re.match('(D )(. )', input)
start = match.group(1)
end = match.group(2)
print input, start, end
Комментарии:
1. Вероятно, вам могло бы сойти с рук
(. )
вместо(d. )
2. Одна строка будет
start, end = re.match(r'(D )(. )', input).groups()
.3. @F.J: Не повезло, если совпадения нет. Однострочники не находят большого применения в реальном мире.
4. @ZackBloom: OP хочет начать с алфавитов, а не без цифр.
5. @JohnMachin Поскольку он не знаком с регулярным выражением, я выбрал самый простой пример, который мог бы сработать. Но, при необходимости, более точное выражение может быть
^([A-Z]{2,})(d[a-zA-Z0-9] )$
.
Ответ №2:
РЕДАКТИРОВАТЬ: я неправильно понял вопрос, думал, вам нужны 3 группы, а не две. Ответ Зака Блума более правильный, но я оставлю это здесь в качестве ссылки на случай, если у кого-то возникнет подобный вопрос.
Вы можете использовать re.split
:
>>> re.split(r'(d )', 'PR405j')
['PR', '405', 'j']
Хитрость здесь заключается в использовании группы захвата (в круглых скобках) в качестве регулярного выражения для разделения; это приведет к тому, что выходные данные будут содержать части, которые вызвали разделение, а также части по обе стороны от него. Если у вас есть строка с несколькими группами цифр, разделенных не цифрами, это полностью разделит строку:
>>> re.split(r'(d )', 'PR405j123abc')
['PR', '405', 'j', '123', 'abc']
Комментарии:
1. Это не разбивается
PR405j
наPR
и405j
.
Ответ №3:
повторно разделите, как и остальные ответы. Но вы должны использовать его, чтобы справиться с группировкой:
import re
re.split(r'([a-zA-Z] )', 'PR405j', 1)[1:]