To będzie działać, korzystając itertools.groupby
z = ['z+2-44', '4+55+z+88']
print([["".join(x) for k,x in itertools.groupby(i,str.isalnum)] for i in z])
wyjściowa:
[['z', '+', '2', '-', '44'], ['4', '+', '55', '+', 'z', '+', '88']]
To zaledwie kilka z znaki alfanumeryczne jeśli oni (lub nie), po prostu połączyć je z powrotem na liście zrozumieniem.
EDYCJA: ogólny przypadek kalkulatora z nawiasem został zadany jako kolejne pytanie here. Jeśli z
jest następujący:
z = ['z+2-44', '4+55+((z+88))']
następnie z poprzedniej grupy otrzymujemy:
[['z', '+', '2', '-', '44'], ['4', '+', '55', '+((', 'z', '+', '88', '))']]
co nie jest łatwe do analizowania pod względem żetonów. Więc zmiana byłaby join
tylko jeśli ALPHANUM i niech jak listy, jeśli nie, to spłaszczenie w końcu za pomocą chain.from_iterable
:
print([list(itertools.chain.from_iterable(["".join(x)] if k else x for k,x in itertools.groupby(i,str.isalnum))) for i in z])
co daje:
[['z', '+', '2', '-', '44'], ['4', '+', '55', '+', '(', '(', 'z', '+', '88', ')', ')']]
(zauważ, że alternatywny regex odpowiedź może również zostać dostosowany tak: [re.findall('\w+|\W', s) for s in lst]
(zauważ brak +
po W
)
również "".join(list(x))
jest nieco szybciej niż "".join(x)
, ale Pozwolę ci to dodać, aby uniknąć zmiany widoczności tego już złożonego wyrażenia.
Podano, że specyfikacja jest niekompletna. A co z operatorami matematyki * i /? A co ze zmiennymi a, b i c? Czy pi jest stałą, zmienną lub p * i? Podane pytanie przyciągnie odpowiedzi, które mogą nie być przydatne we wszystkich przypadkach. –
@martineau Uważam, że pytanie [this] (http://stackoverflow.com/questions/4736/learning-regular-expressions) nie jest właściwym duplikatem. – Kasramvd
@Kasramvd: Byłbym zainteresowany usłyszeniem, dlaczego tak myślisz. – martineau