variable = ";CREATEDBY~string~1~~72~0~0~0~~~0;CREATEDBYNAME~string~1~~800~0~0~0~~~1;CREATEDBYYOMINAME~string~1~~800~0~0~0~~~2;CREATEDON~date~1~yyyy-MM-dd HH:mm:ss.SSS~26~0~0~0~~~3;CREATEDONUTC~date~1~yyyy-MM-dd HH:mm:ss.SSS~26~0~0~0~~~4"
Как я могу разделить каждое значение, которое находится между (;
и ~
)?
Результат будет как CREATEDBY,CREATEDBYNAME,CREATEDBYYOMINAME,...
Я пробовал следующее, но это первое появление.
variable[variable.find(";")+1:myString.find("~")]
Как получить список строк с помощью разделения?
Возможный дубликат Как разбить строку на список? Обратите внимание, что второй ответ указывает, как указать разделитель.
Мы можем попробовать использовать re.findall
с шаблоном ;(\w+)(?=~)
:
variable = ";CREATEDBY~string~1~~72~0~0~0~~~0;CREATEDBYNAME~string~1~~800~0~0~0~~~1;CREATEDBYYOMINAME~string~1~~800~0~0~0~~~2;CREATEDON~date~1~yyyy-MM-dd HH:mm:ss.SSS~26~0~0~0~~~3;CREATEDONUTC~date~1~yyyy-MM-dd HH:mm:ss.SSS~26~0~0~0~~~4"
result = re.findall(r';(\w+)~', variable)
print(result)
['CREATEDBY', 'CREATEDBYNAME', 'CREATEDBYYOMINAME', 'CREATEDON', 'CREATEDONUTC']
Он отклоняется, если имя COLUMN имеет '_' (т.е. CREATED_BY)
@Vicky Затем используйте \w+
, который включает символы подчеркивания, чтобы сопоставить ваши слова.
@Vicky: хорошее наблюдение. Вот почему я ненавижу Regex. Никогда не знаешь, что они на самом деле делают и каковы были их намерения. Их очень легко случайно ошибиться.
@ Томас Я не уверен, что это причина ненавидеть Regex. [A-Z]
должен говорить без пояснений, что он не будет соответствовать подчеркиванию, и вопрос, возможно, был более ясным, что подчеркивания должны совпадать.
@ThomasWeller, хотя я уверен, что вы можете найти вырожденные случаи, в котором я полностью с вами согласен, рассматриваемое регулярное выражение настолько тривиально, что любой опытный программист должен иметь возможность сразу понять, что он делает, даже если они не знакомы с особенностями Python аромат регулярного выражения. А что касается того, что я ошибаюсь, то обвинять выбор инструмента в коде, не удовлетворяющем неполной спецификации, - это то, от чего я просто не могу отказаться.
@JaredSmith: банально это или нет, я не могу судить. Спецификация не так уж плоха относительно подчеркивания: между ;
и ~
не сказано, что должно быть слово (\w
). Так что [^~]
был бы ближе к спецификации. Затем мне интересно, почему он говорит, что шаблон должен быть ;(\w+)(?=~)
, но затем использует ;(\w+)~
в коде.
Использование str.split
Бывший:
variable = ";CREATEDBY~string~1~~72~0~0~0~~~0;CREATEDBYNAME~string~1~~800~0~0~0~~~1;CREATEDBYYOMINAME~string~1~~800~0~0~0~~~2;CREATEDON~date~1~yyyy-MM-dd HH:mm:ss.SSS~26~0~0~0~~~3;CREATEDONUTC~date~1~yyyy-MM-dd HH:mm:ss.SSS~26~0~0~0~~~4"
for i in variable.strip(";").split(";"):
print(i.split("~", 1)[0])
#or
print([i.split("~", 1)[0] for i in variable.strip(";").split(";")])
Вывод:
CREATEDBY
CREATEDBYNAME
CREATEDBYYOMINAME
CREATEDON
CREATEDONUTC
['CREATEDBY', 'CREATEDBYNAME', 'CREATEDBYYOMINAME', 'CREATEDON', 'CREATEDONUTC']
Вы можете split()
строку, а затем find()
первый ~
для каждого из них:
variable = ";CREATEDBY~string~1~~72~0~0~0~~~0;CREATEDBYNAME~string~1~~800~0~0~0~~~1;CREATEDBYYOMINAME~string~1~~800~0~0~0~~~2;CREATEDON~date~1~yyyy-MM-dd HH:mm:ss.SSS~26~0~0~0~~~3;CREATEDONUTC~date~1~yyyy-MM-dd HH:mm:ss.SSS~26~0~0~0~~~4"
result = [item[:item.find('~')] for item in variable.split(';')]
print(result)
import re
variable = ";CREATEDBY~string~1~~72~0~0~0~~~0;CREATEDBYNAME~string~1~~800~0~0~0~~~1;CREATEDBYYOMINAME~string~1~~800~0~0~0~~~2;CREATEDON~date~1~yyyy-MM-dd HH:mm:ss.SSS~26~0~0~0~~~3;CREATEDONUTC~date~1~yyyy-MM-dd HH:mm:ss.SSS~26~0~0~0~~~4"
pattern = re.compile (";(.+?)~")
matches = re.findall ( pattern, variable )
print matches
Используйте регулярное выражение с смотреть вперед и смотреть назад:
>>> import re
>>> re.findall(r'(?<=;).*?(?=~)', variable)
['CREATEDBY', 'CREATEDBYNAME', 'CREATEDBYYOMINAME', 'CREATEDON', 'CREATEDONUTC']
Написал такой же ответ 5 минут назад. Вам даже не понадобятся поисковые пути, если вы поместите имя в группу захвата.
Да, эти два ответа довольно похожи, но я бы не назвал их одинаковыми.
использовать функцию разделения. mystring.split (';'), затем mystirng.split ('~')