【问题标题】:splitting a string on multiple delimiters [duplicate]在多个分隔符上拆分字符串[重复]
【发布时间】:2020-04-17 16:13:55
【问题描述】:

我有一个熊猫数据框中的化学反应列表,我想将其拆分为它们的成分。方程式并不复杂,这里有几个例子:

N2 + CH4 → HCN + NH3

H2+F2→2HF 

目标是在 + 和 → 上拆分字符串并得到以下内容

['N2','CH4','HCN','NH3]
[H2,'F2','HF']

这是我目前所拥有的

import re

df = pd.read_csv("foo.csv") # read the csv file

convert=df['Reaction'].to_string() # convert the reaction column to a string object

result = re.split(r'(\+ →)',convert) # attempt to split on the two delimiters

# alternatively I have tried replacing the right arrow with its unicode equivalent like this

# result = re.split(r'\+\u2192)',convert) 

每次我运行这段代码时,我都会得到相同的字符串,没有任何变化。

我还尝试将列保留为列表对象而不是字符串对象,然后

试图拆分它,当我这样做时,我得到Type Error: Expected string or bytes-like object

【问题讨论】:

  • 您可以使用字符类代替[+ →]+ 请参阅ideone.com/xKRi3c
  • 你也许可以在\W+上拆分

标签: regex python-3.x pandas


【解决方案1】:

由于您使用的是数据框,因此可以使用 pandas 方法 Series.str.split。我们可以拆分多个字符。只有在这种情况下,我们才会在某些情况下使用空格,因此我们也将其考虑在内。

df['Reaction_new'] = df['Reaction'].str.split('\s?[+→]\s?')

或者如 ctwheels 在 cmets 中所述,简单地说:

df['Reaction_new'] = df['Reaction'].str.split('\W+')
               Reaction         Reaction_new
0  N2 + CH4 → HCN + NH3  [N2, CH4, HCN, NH3]
1             H2+F2→2HF        [H2, F2, 2HF]

【讨论】:

  • 我会将您的第一个正则表达式更改为简单的\s?[+→]\s?(零或一个空格)或\s*[+→]\s*(任意数量的空格)
  • 好点,谢谢。 @ctwheels
【解决方案2】:

您正在拆分文字字符串 + →,但它从未出现在您的数据中。

您可以使用[] 匹配多个字符中的任何一个。

result = re.split(r'\s*[+→]\s*',convert)

此外,您不应在定界符正则表达式周围放置捕获组,因为这会导致定界符包含在结果中。

【讨论】:

    猜你喜欢
    • 2019-08-21
    • 2017-03-21
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2020-10-03
    相关资源
    最近更新 更多