Я намагаюся розділити рядок на кілька символів у 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 | [ :;"?=()![]-] )
[ :;"?=()![]-]+