我有一个字符串text
和一个列表names
- 我想分割
text
每次出现的一个元素发生names
。
names = ['Mr. Mike, ADS', 'Monika, TFO', 'Peter, WQR']
text1 = ['Mrs. Monika, TFO goes shopping. Then she rides bike. Mike, ADS likes Pizza. Monika, TFO hates me.']
text
并不总是以names
元素开头。names
中的元素顺序与text
中的元素顺序无关。- 元素是唯一的,但可以在
text
中出现多次。因此,输出的列表比names
的字符串要多。 - 最终,我希望输出是列表的列表,其中每个分割的
text
切片对应于它在names
中的元素,它被分割。列表的顺序并不重要。 - 的一些元素
names
之前是"太太"或"先生"。只有一些相应的匹配在text
之前‘夫人’或‘先生’。
names
中的def create_regex_string(name: List[str]) -> str:
name_components = name.split()
if len(name_components) == 1:
return re.escape(name)
salutation, *name = name_components
return f"({re.escape(salutation)} )?{re.escape(' '.join(name))}"
regex_string = "|".join(create_regex_string(name) for name in names)
group_count = regex_string.count("(") + 1
fragments = re.split(f"({regex_string})", text1)
if fragments:
if not fragments[0] in names:
fragments = fragments[1:]
result = [[name, text1.rstrip()] for name, text1 in zip(
fragments[::group_count+1],
fragments[group_count::group_count+1]
) if text1 is not None
]
print(result)
[['Monika, TFO', ' goes shopping. Then she rides bike.'], ['Mike, ADS', ' likes Pizza.'], ['Monika, TFO', " hates me.'"]]
代码适用于示例性数据,但当我使用实际数据(如下)时,它会导致空列表。为什么?
names = ['Präsidentin Diezel', 'Vizepräsidentin Dr. Klaubert', 'Adams, BÜNDNIS 90/DIE GRÜNEN', 'Dr. Augsten, BÜNDNIS 90/DIE GRÜNEN', 'Barth, FDP', 'Baumann, SPD', 'Bergemann, CDU', 'Bernd Müller-Pathle, CDU', 'Winfried Neumann, CDU', 'Norbert Otto, CDU', 'Ralf Päsler, GRÜNE', 'Frank-Michael Pietzsch, CDU', 'Günter Pohl, SPD', 'Jörg Pöse, PDS', 'Andreas Preller, SPD', 'Egon Primas, CDU', 'Ingrid Raber, SPD', 'Helmut Rieth, SPD', 'Matthias Ritter, CDU', 'Christine Rudolph, SPD', 'Fritz Schröter, CDU', 'Gerd Schuchardt, SPD', 'Horst Schulz, CDU', 'Peter Schütz, CDU', 'Jörg Schwäblein, CDU', 'Harald Seidel, SPD', 'Hartmut Sieckmann, FDP', 'Volker Sklenar, CDU', 'Andreas Sonntag, CDU', 'Manfred Spieß, CDU', 'Harald Stauch, CDU', 'Axel Stelzner, CDU', 'Olaf Stepputat, FDP', 'Annett Stiebritz, FDP', 'Tamara Thierbach, PDS', 'Andreas Trautvetter, CDU', 'Werner Ulbrich, CDU', 'Hans-Jürgen Wagner, CDU', 'Dietmar Werner, CDU', 'Kurt Weyh, SPD', 'Gerhard Wien, DJ', 'Bernd Wolf, CDU', 'Gert Wunderlich, CDU', 'Klaus Zeh, CDU', 'Gabi Zimmer, PDS', 'Rosemarie Bechthum, SPD', 'Almuth Beck, PDS', 'Dagmar Becker, SPD', 'Klaus Borck, SPD', 'Detlev Braasch, CDU', 'Heinrich Dietz, CDU', 'Birgit Diezel, CDU', 'Steffen Dittes, PDS', 'Sabine Doht, SPD', 'Ursula Fischer, PDS', 'Klaus Goedecke, SPD', 'Jochen Greiner-Well, SPD', 'Günter Grüner, CDU', 'Johann Günter Harrer, PDS', 'Carmen Jähnke, SPD', 'Steffen Kachel, PDS', 'Birgit Klaubert, PDS', 'Christine Ursula Klaus, SPD', 'Christian Köckert, CDU', 'Horst Krauße, CDU', 'Dagmar Künast, SPD', 'Benno Lemke, PDS', 'Alfred Müller, SPD', 'Christiane Neudert, PDS', 'Cornelia Nitzpon, PDS', 'Birgit Pelke, SPD', 'Werner Pidde, SPD', 'Sieghardt Rydzewski, SPD', 'Konrad Scheringer, PDS', 'Gottfried Schugens, CDU', 'Franz Schuster, CDU', 'Dieter Strödter, SPD', 'Christina Tasch, CDU', 'Bernhard Vogel, CDU', 'Bärbel Vopel, CDU', 'Roland Wanitschka, PDS', 'Siegfried Wetzel, CDU', 'Heide Wildauer, PDS', 'Christine Zitzmann, CDU', 'Gustav Bergemann, CDU', 'Gerhard Botz, SPD', 'Werner Buse, PDS', 'Christian Carius, CDU', 'Richard Dewes, SPD', 'Jens Goebel, CDU', 'Manfred Grob, CDU', 'Evelin Groß, CDU', 'Petra Heß, SPD', 'Michael Heym, CDU', 'Uwe Höhn, SPD', 'Mike Huster, PDS', 'Karin Kaschuba, PDS', 'Ingrid Kraushaar, CDU', 'Otto Kretschmer, SPD', 'Klaus von der Krone, CDU', 'Tilo Kummer, PDS', 'Annette Lehmann, CDU', 'Harald Michel, CDU', 'Mike Mohring, CDU', 'Maik Nothnagel, PDS', 'Michael Panse, CDU', 'Volker Pöhler, CDU', 'Bodo Ramelow, PDS', 'Volker Schemmel, SPD', 'Heidrun Sedlacik, PDS', 'Reyk Seela, CDU', 'Michaele Sojka, PDS', 'Isolde Stangner, PDS', 'Elisabeth Wackernagel, CDU', 'Wolfgang Wehner, CDU', 'Katja Wolf, PDS', 'Gabriele Zimmer, PDS', 'Matthias Bärwolff, Die Linke', 'Rolf Baumann, SPD', 'Andreas Bausewein, SPD', 'Barbara Bechmann, CDU', 'Sabine Berninger, Die Linke', 'André Blechschmidt, Die Linke', 'Ralf Bornkessel, CDU', 'Werner Buse, Die Linke', 'Monika Döllstedt, Die Linke', 'David-Christian Eckardt, SPD', 'Antje Ehrlich-Strathausen, SPD', 'Petra Enders, Die Linke', 'Ruth Fuchs, Die Linke', 'Michael Gerstenberger, Die Linke', 'Christian Gumprecht, CDU', 'Gerhard Günther, CDU', 'Roland Hahnemann, Die Linke', 'Ralf Hauboldt, Die Linke', 'Dieter Hausold, Die Linke', 'Susanne Hennig, Die Linke', 'Gudrun Holbe, CDU', 'Elke Holzapfel, CDU', 'Mike Huster, Die Linke', 'Margit Jung, Die Linke', 'Ralf Kalich, Die Linke', 'Karin Kaschuba, Die Linke', 'Birgit Klaubert, Die Linke', 'Peter D. Krause, CDU', 'Jörg Kubitzki, Die Linke', 'Tilo Kummer, Die Linke', 'Frank Kuschel, Die Linke', 'Benno Lemke, Die Linke', 'Ina Leukefeld, Die Linke', 'Christoph Matschie, SPD', 'Beate Meißner, CDU', 'Kersten Naumann, Die Linke', 'Maik Nothnagel, Die Linke', 'Eckhard Ohl, SPD', 'Walter Pilger, SPD', 'Bodo Ramelow, Die Linke', 'Jürgen Reinholz, CDU', 'Wieland Rose, CDU', 'Johanna Scheringer-Wright, Die Linke', 'Dagmar Schipanski, CDU', 'Michael Schneider, CDU', 'Hartmut Schubert, SPD', 'Heidrun Sedlacik, Die Linke', 'Diana Skibbe, Die Linke', 'Michaele Sojka, Die Linke', 'Carola Stauche, CDU', 'Heike Taubert, SPD', 'Tamara Thierbach, Die Linke', 'Marion Walsmann, CDU', 'Gabriela Weißbrodt, CDU', 'Katja Wolf, Die Linke', 'Henry Worm, CDU', 'Dirk Adams, GRÜNE', 'Frank Augsten, GRÜNE', 'Uwe Barth, FDP', 'Matthias Bärwolff, DIE LINKE', 'Dirk Bergner, FDP', 'Sabine Berninger, DIE LINKE', 'André Blechschmidt, DIE LINKE', 'Petra Enders, DIE LINKE', 'Thomas Hartung, SPD', 'Ralf Hauboldt, DIE LINKE', 'Dieter Hausold, DIE LINKE', 'Manfred Hellmann, DIE LINKE', 'Susanne Hennig, DIE LINKE', 'Matthias Hey, SPD', 'Franka Hitzing, FDP', 'Mike Huster, DIE LINKE', 'Margit Jung, DIE LINKE', 'Ralf Kalich, DIE LINKE', 'Regine Kanis, SPD', 'Karin Kaschuba, DIE LINKE', 'Birgit Keller, DIE LINKE', 'Jörg Kellner, CDU', 'Thomas L. Kemmerich, FDP', 'Birgit Klaubert, DIE LINKE', 'Katharina König-Preuss, DIE LINKE', 'Marian Koppe, FDP', 'Knut Korschewsky, DIE LINKE', 'Maik Kowalleck, CDU', 'Jörg Kubitzki, DIE LINKE', 'Tilo Kummer, DIE LINKE', 'Frank Kuschel, DIE LINKE', 'Wolfgang Lemb, SPD', 'Ina Leukefeld, DIE LINKE', 'Ute Lukasch, DIE LINKE', 'Gudrun Lukin, DIE LINKE', 'Dorothea Marx, SPD', 'Peter Metz, SPD', 'Carsten Meyer, GRÜNE', 'Dirk Möller, DIE LINKE', 'Eleonore Mühlbauer, SPD', 'Maik Nothnagel, DIE LINKE', 'Bodo Ramelow, DIE LINKE', 'Lutz Recknagel, FDP', 'Martina Renner, DIE LINKE', 'Astrid Rothe-Beinlich, GRÜNE', 'Claudia Scheerschmidt, SPD', 'Manfred Scherer, CDU', 'Johanna Scheringer-Wright, DIE LINKE', 'Jennifer Schubert, GRÜNE', 'Heidrun Sedlacik, DIE LINKE', 'Anja Siegesmund, GRÜNE', 'Diana Skibbe, DIE LINKE', 'Michaele Sojka, DIE LINKE', 'Gisela Sparmberg, FDP', 'Karola Stange, DIE LINKE', 'Heinz Untermann, FDP', 'Mario Voigt, CDU', 'Frank Weber, SPD', 'Katja Wolf, DIE LINKE', 'Gerold Wucherpfennig, CDU', 'Sabine Berninger, LINKE', 'André Blechschmidt, LINKE', 'Andreas Bühl, CDU', 'Steffen Dittes, LINKE', 'Kati Engel, LINKE', 'Kristin Floßmann, CDU', 'Jörg Geibert, CDU', 'Siegfried Gentele, fraktionslos', 'Stefan Gruhner, CDU', 'Ronald Hande, LINKE', 'Steffen Harzer, LINKE', 'Dieter Hausold, LINKE', 'Oskar Helmerich, SPD', 'Madeleine Henfling, GRÜNE', 'Jörg Henke, AfD', 'Susanne Hennig-Wellsow, LINKE', 'Corinna Herold, AfD', 'Christian Herrgott, CDU', 'Björn Höcke, AfD', 'Margit Jung, LINKE', 'Ralf Kalich, LINKE', 'Olaf Kießling, AfD', 'Thadäus König, CDU', 'Katharina König-Preuss, LINKE', 'Roberto Kobelt, GRÜNE', 'Knut Korschewsky, LINKE', 'Rainer Kräuter, LINKE', 'Jens Krumpe, fraktionslos', 'Jörg Kubitzki, LINKE', 'Tilo Kummer, LINKE', 'Frank Kuschel, LINKE', 'Diana Lehmann, SPD', 'Ina Leukefeld, LINKE', 'Gerold Wucherpfennig , Minister für Bundes- und Europaangelegenheiten und Chef der Staatskanzlei', 'Klaus Zeh , Minister für Bundes- und Europaangelegenheiten und Chef der Staatskanzlei', 'Karl Heinz Gasser , Innenminister', 'Manfred Scherer , Innenminister', 'Jens Goebel , Kultusminister', 'Bernward Müller , Kultusminister', 'Harald Schliemann , Justizminister(in)', 'Marion Walsmann , Justizminister(in)', 'Birgit Diezel , Finanzministerin', 'Jürgen Reinholz, Minister für Wirtschaft, Technologie und Arbeit', 'Klaus Zeh , Minister(in) für Soziales, Familie und Gesundheit', 'Christine Lieberknecht , Minister(in) für Soziales, Familie und Gesundheit', 'Georg Maier, Minister für Inneres und Kommunales', 'Birgit Klaubert, Minister(in) für Bildung, Jugend und Sport', 'Helmut Holter, Minister(in) für Bildung, Jugend und Sport', 'Dieter Lauinger, Minister für Migration, Justiz und Verbraucherschutz', 'Wolfgang Tiefensee, Minister für Wirtschaft, Wissenschaft und Digitale Gesellschaft', 'Heike Werner, Ministerin für Arbeit, Soziales, Gesundheit, Frauen und Familie', 'Birgit Keller, Minister(in) für Infrastruktur und Landwirtschaft', 'Benjamin-Immanuel Hoff , Minister(in) für Infrastruktur und Landwirtschaft', 'Wolfgang Tiefensee, Erster Stellvertreter des Ministerpräsidenten', 'Georg Maier, Erster Stellvertreter des Ministerpräsidenten', 'Anja Siegesmund, Zweite Stellvertreterin des Ministerpräsidenten', 'Benjamin-Immanuel Hoff, Minister(in) für Infrastruktur und Landwirtschaft', 'Susanna Karawanskij, Minister(in) für Infrastruktur und Landwirtschaft', 'Helmut Holter, Minister für Bildung, Jugend und Sport', 'Dirk Adams, Minister für Migration, Justiz und Verbraucherschutz']
text1 = 'Präsidentin Diezel: Meine der Abgeordnete Recknagel, eordnete Metz. Als gemeldet Abgeordneter Dirk Adams, BÜNDNIS 90/DIE GRÜNEN. Abgeordneter Adams, BÜNDNIS 90/DIE GRÜNEN: Sehr Thema Präsidentin Diezel: Vielen Abgeordneter Adams. Als Abgeordnete Bergemann, CDU-Fraktion. Abgeordneter Bergemann, CDU: Frau Präsidentin ich. Präsidentin Diezel: Danke, Frau Abgeordnete Schubert. Für Herr Abgeordneter Krauße. Abgeordneter Krauße, CDU: Frau Präsidentin, versprechen. Vizepräsidentin Dr. Klaubert: Es gibt Abgeordneter Kuschel, DIE LINKE: Danke, Frau Vizepräsidentin Dr. Klaubert: Frau Abgeordnete Wolf, Abgeordnete Wolf, DIE LINKE: Ich habe die Prof. Dr. Deufel, Staatssekretär: Die liste Vizepräsidentin Dr. Klaubert: Nachfragen. Frau Abgeordnete Ren- ner, bitte. Abgeordnete Renner, DIE LINKE: Herr Minister, anzusehen. Prof. Dr. Huber, Innenminister: Frau Abgeordnete Renner, ich. Vizepräsidentin Dr. Klaubert: Es Abend. '
def create_regex_string(name: List[str]) -> str:
name_components = name.split()
if len(name_components) == 1:
return re.escape(name)
salutation, *name = name_components
return f"({re.escape(salutation)} )?{re.escape(' '.join(name))}"
regex_string = "|".join(create_regex_string(name) for name in names)
group_count = regex_string.count("(") + 1
fragments = re.split(f"({regex_string})", text1)
if fragments:
if not fragments[0] in names:
fragments = fragments[1:]
result = [
[name, text1.rstrip()]
for name, text1 in zip(
fragments[::group_count+1],
fragments[group_count::group_count+1]
)
if text1 is not None
]
print(result)
[]
编辑
names
对应set2
,text1
对应c_list6
set2 = ['Präsidentin Diezel', 'Blechschmidt, DIE LINKE', 'Althaus, CDU', 'Arenhövel, CDU', 'Axthelm, CDU', 'Backhaus, FDP', 'Bauch, CDU', 'Böck, CDU', 'Bohn, FDP', 'Bonitz, CDU', 'Büchner, NF', 'Hartung, DIE LINKE', 'Dannenberg, CDU', 'Dietl, DIE LINKE', 'Dietze, SPD', 'Döring, SPD', 'Duchač, CDU', 'Emde, CDU', 'Eckstein, CDU', 'Ellenberger, SPD', 'Emde, CDU', 'Enkelmann, SPD']
c_list6 = "eröffnet. Präsidentin Diezel: Bitte schön, Herr Blechschmidt. Abgeordneter Blechschmidt, DIE LINKE: Danke, Frau Präsidentin. Fraktion begründen. Präsidentin Diezel: Bitte schön, dann Abgeordneter Dr. Hartung, DIE LINKE: Frau Präsidentin, sehr geehrte Damen Vielen Dank. (Beifall DIE LINKE, BÜNDNIS 90/DIE GRÜNEN) Präsidentin Diezel: Möchte Herr Abge- ordneter Emde. Abgeordneter Emde, CDU: Frau Präsidentin, wir nungspunkt. Präsidentin Diezel: Vielen Dank. schön, Herr Abgeordneter Bergner. Abgeordneter Bergner, FDP: Frau Präsidentin, die Fraktion Tagesordnung. Präsidentin Diezel: Weitere Die Fraktion BÜNDNIS 90/DIE GRÜNEN, Frau Rothe-Beinlich. Nein, aha Herr Dr. Pidde. Abgeordneter Dr. Pidde, SPD: CDU und SPD wird. (Zwischenruf Abg. Fiedler, CDU: Wir sind nicht in) Präsidentin Diezel: Als erster Bitte, Frau Rothe-Beinlich. 460 Abgeordnete Rothe-Beinlich, BÜNDNIS 90/DIE GRÜNEN: Die Fraktion BÜNDNIS 90/DIE GRÜNEN Herr Dr. Pidde hat. Präsidentin Diezel: Dann frage "
def create_regex_string(name: List[str]) -> str:
name_components = name.split()
if len(name_components) == 1:
return re.escape(name)
salutation, *name = name_components
return f"(?:{re.escape(salutation)} )?{re.escape(' '.join(name))}"
regex_string = "|".join(create_regex_string(name) for name in set2)
group_count = regex_string.count("(") + 1
fragments = re.split(f"({regex_string})", c_list6)
if fragments and fragments[0] not in set2:
fragments = fragments[1:]
fragments = fragments[:-1] if len(fragments) % 2 != 0 else fragments
result = [[fragments[i], (fragments[i + 1] or '').rstrip] for i in range(0, len(fragments), 2)]
print(result)
当分割字符串,输出而不是字符串列表方法描述"& lt;内置方法rstrip…">
此外,列表的第一个元素只包含政党名称(DIE LINKE, SPD, CDU,…)而不包含名称。为什么?
[['Präsidentin Diezel', <built-in method rstrip of str object at 0x000001D127D3BA30>], ['Blechschmidt, DIE LINKE', <built-in method rstrip of str object at 0x000001D127D3BBB0>], ['Präsidentin Diezel', <built-in method rstrip of str object at 0x000001D127D3B830>], ['Hartung, DIE LINKE', <built-in method rstrip of str object at 0x000001D13A7A31E0>], ['DIE LINKE', <built-in method rstrip of str object at 0x000001D123A706C0>], ['Präsidentin Diezel', <built-in method rstrip of str object at 0x000001D123A744B0>], ['Emde, CDU', <built-in method rstrip of str object at 0x000001D127D3B6B0>], ['Präsidentin Diezel', <built-in method rstrip of str object at 0x000001D12337FD50>], ['FDP', <built-in method rstrip of str object at 0x000001D127D3BC30>], ['Präsidentin Diezel', <built-in method rstrip of str object at 0x000001D127126510>], ['SPD', <built-in method rstrip of str object at 0x000001D128F6C130>], ['CDU', <built-in method rstrip of str object at 0x000001D12AD5FBB0>], ['SPD', <built-in method rstrip of str object at 0x000001D123A65630>], ['CDU', <built-in method rstrip of str object at 0x000001D1286F2260>], ['Präsidentin Diezel', <built-in method rstrip of str object at 0x000001D12CD6C230>], ['Präsidentin Diezel', <built-in method rstrip of str object at 0x000001D1286F2120>]]
[['Präsidentin Diezel', <built-in method rstrip of str object at 0x000001D127D3BA30>], ['Blechschmidt, DIE LINKE', <built-in method rstrip of str object at 0x000001D127D3BBB0>], ['Präsidentin Diezel', <built-in method rstrip of str object at 0x000001D127D3B830>], ['Hartung, DIE LINKE', <built-in method rstrip of str object at 0x000001D13A7A31E0>], ['DIE LINKE', <built-in method rstrip of str object at 0x000001D123A706C0>], ['Präsidentin Diezel', <built-in method rstrip of str object at 0x000001D123A744B0>], ['Emde, CDU', <built-in method rstrip of str object at 0x000001D127D3B6B0>], ['Präsidentin Diezel', <built-in method rstrip of str object at 0x000001D12337FD50>], ['FDP', <built-in method rstrip of str object at 0x000001D127D3BC30>], ['Präsidentin Diezel', <built-in method rstrip of str object at 0x000001D127126510>], ['SPD', <built-in method rstrip of str object at 0x000001D128F6C130>], ['CDU', <built-in method rstrip of str object at 0x000001D12AD5FBB0>], ['SPD', <built-in method rstrip of str object at 0x000001D123A65630>], ['CDU', <built-in method rstrip of str object at 0x000001D1286F2260>], ['Präsidentin Diezel', <built-in method rstrip of str object at 0x000001D12CD6C230>], ['Präsidentin Diezel', <built-in method rstrip of str object at 0x000001D1286F2120>]]
您应该通过将最后一行更改为
使create_regex_string
中的可选组不可捕获。return f"(?:{re.escape(salutation)} )?{re.escape(' '.join(name))}"
同样,您应该避免像group_count
这样的附加变量。将代码的最后一部分替换为:
fragments = re.split(f"({regex_string})", text1)
if fragments and fragments[0] not in names:
fragments = fragments[1:]
result = [[fragments[i], fragments[i + 1].rstrip()] for i in range(0, len(fragments), 2)]
print(result)
您忘记调用str
的rstrip
方法,那么为什么它返回<built-in method rstrip of str object at 0x000001D127D3BA30>
对象呢?
result = [[fragments[i], (fragments[i + 1] or '').rstrip()] for i in range(0, len(fragments), 2)]