/ / Розбити рядок на кілька символів у python - python, regex, string, split

Розділити рядок на кілька символів у python - python, regex, string, split

Я намагаюся розділити рядок на кілька символів у python так само, як я роблю в Java, як це:

private static final String SPECIAL_CHARACTERS_REGEX = "[ :;"?=()!\[\]-]+|(?<=\d)(?=\D)";
String rawMessage = "let"s meet tomorrow at 9:30p? 7-8pm? i=you go (no Go!) [to do !]";
String[] tokens = rawMessage.split(SPECIAL_CHARACTERS_REGEX);
System.out.println(Arrays.toString(tokens));

Ось робоча демонстрація з правильним виходом: Робоча демонстрація

Я намагаюсь зробити точно так само в python, алеколи я роблю це, це не буде токенізувати взагалі, якщо я просто додати символ "одиночних лапок" в регулярному виразі. Як створити такий же результативний синтаксичний аналіз з python як з програми Java вище?

Це:

import re
tokens = re.split(" .", line);
print tokens

Для лінії:

"let"s meet tomorrow at 9:30p? 7-8pm? i=you go (no Go!) [to do !]"

Дає:

["let"s meet tomorrow at 9:30p? 7-8pm? i=you go (no Go!) [to do !]";]

Коли я це робив це:

[let, s, meet, tomorrow, at, 9, 30, p, 7, 8, pm, i, you, go, no, Go, to, do]

Відповіді:

2 для відповіді № 1

Ось така альтернатива знаходить а не розкол:

>>> s = "let"s meet tomorrow at 9:30p? 7-8pm? i=you go (no Go!) [to do !]"
>>> re.findall(r"d+|[A-Za-z]+", s)
["let", "s", "meet", "tomorrow", "at", "9", "30", "p", "7", "8", "pm", "i", "you", "go", "no", "Go", "to", "do"]

Якщо це добре, щоб зберегти разом літери та цифри "[0-9A-Za-z]+". Для літер, цифр та підкреслення використовуйте r"w+".


1 для відповіді № 2

Використовуйте той самий регулярний вираз, який ви використовували в Java:

line = "let"s meet tomorrow at 9:30p? 7-8pm? i=you go (no Go!) [to do !]"
tokens = re.split("[ :;"?=()!\[\]-]+|(?<=\d)(?=\D)", line)
tokens = [token for token in tokens if len(token) != 0] # remove empty strings!
print(tokens)
# ["let", "s", "meet", "tomorrow", "at", "9", "30p", "7", "8pm", "i", "you", "go", "no", "Go", "to", "do"]

0 для відповіді № 3

Використовуйте наступний код

>>> chars = "[:;"?=()!-]+<" #Characters to remove
>>> sentence = "let"s meet tomorrow at 9:30p? 7-8pm? i=you go (no Go!) [to do !]" #Sentence
>>> for k in sentence: #Loops over everything in the sentence
...     if k in chars: #Checks if the variable is one we want to remove
...             sentence = sentence.replace(k, " ") #If it is, it replaces it
...
>>> sentence = sentence.replace("p", " p").replace("pm", " pm").split() #Adds a space before the "p" and the "pm", and then splits it the way we want to
>>> sentence
["let", "s", "meet", "tomorrow", "at", "9", "30", "p", "7", "8", "pm", "i", "you", "go", "no", "Go", "to", "do"]

Якщо ви хочете використовувати regex:

line = "let"s meet tomorrow at 9:30p? 7-8pm? i=you go (no Go!) [to do !]"
tokens = re.split("[ :;"?=()!\[\]-]+|(?<=\d)(?=\D)", line)
tokens = [token for token in tokens if len(token) != 0]
tokens = tokens.replace("p", " p").replace("pm", " pm").split()
print(tokens)
#["let", "s", "meet", "tomorrow", "at", "9", "30", "p", "7", "8", "pm", "i", "you", "go", "no", "Go", "to", "do"]

0 для відповіді № 4

Цей розділовий регулярний вираз в Java повинен був працювати в Python.
Ймовірно, це помилка. Плутанина, мабуть, буде перекриття
між D і [ :;"?=()![]-], і як це обробляє (помилка ~).

Ви можете спробувати вирішити це, поставивши (?<=d)(?=D) по-перше, але це
повинен бути змушений зробити це.

Цей регулярний вираз примушує його це зробити. Це обхідний шлях?
Я не знаю, не треба мати тест з python. Але це працює в Perl.

Примусовий регулярний вираз -

 #  (?<=d)(?:[ :;"?=()![]-]+|(?=D))|(?<!d|[ :;"?=()![]-])[ :;"?=()![]-]+

(?<= d )
(?:
[ :;"?=()![]-]+
|  (?= D )
)
|
(?<! d | [ :;"?=()![]-] )
[ :;"?=()![]-]+