【问题标题】:Regular expression vectors正则表达式向量
【发布时间】:2021-08-21 23:51:25
【问题描述】:

我正在尝试使用 python (pandas) 和正则表达式加载文件。我找到了解决我的问题的解决方法,但我仍然想找到一个单一的解决方案,它可能对未来有用。文件格式如下:

1   (a b   c)  (a  b c)   (a b c)
2 (a b c) (a b c)    (a b c)
3       a b   c  a  b c   a b c

请注意,有些是空格,有些是制表符,制表符和/或空格的数量不是恒定的。预期的结果是以下数据帧:

    0   1   2   3   4   5   6   7   8   9
0   1   a   b   c   a   b   c   a   b   c
1   2   a   b   c   a   b   c   a   b   c
2   3   a   b   c   a   b   c   a   b   c

我的最佳结果是使用以下方法获得的:

pd.read_csv('filepath', delimiter='\)*\s+\(*', engine='python', header = None)

这给出了:

    0   1   2   3   4   5   6   7   8   9
0   1   a   b   c   a   b   c   a   b   c)
1   2   a   b   c   a   b   c   a   b   c)
2   3   a   b   c   a   b   c   a   b   c

然后我通过额外的处理摆脱了“)”。我仍然不明白为什么 \s+ 足以删除标签,即 \t (如果有人也可以回答这个问题,那绝对是一个奖励)。

我尝试了不同的方法,但找不到一个可以完成这项工作的正则表达式。我的一些尝试:

\)*\s*\(*
(\)*\s+\(*)|(\))
(\)*\s+\(*)|(\)\n)

有些人很清楚为什么它们不起作用,但我希望最后一个是正确的解决方案。另一种想法是使用\)*\s*\(*,但强制至少一个字符出现在正则表达式中,但我没有找到是否可能。

知道什么是更好的正则表达式吗?

附:如果我逐行读取文件并将 re.split 与正则表达式一起使用,则拆分看起来会有所不同,但我更喜欢使用 pandas。

【问题讨论】:

  • 这导致最后一列NaN,可以轻松删除,但仍然有点害羞
  • \s+ 足以删除制表符,因为它转换为“一个或多个空格”,它将匹配制表符\t

标签: python regex pandas


【解决方案1】:
>>> pd.DataFrame([re.sub(r'[\(\)]', '', line).split()
                      for line in open('data.txt').readlines()])

   0  1  2  3  4  5  6  7  8  9
0  1  a  b  c  a  b  c  a  b  c
1  2  a  b  c  a  b  c  a  b  c
2  3  a  b  c  a  b  c  a  b  c

【讨论】:

    【解决方案2】:

    您可以使用'\s*\(|\)\s*\(|\)|\s+' 作为分隔符。

    • \s*\( 将匹配前面有零或任意数量的空白字符的左括号
    • \)\s*\( 将匹配右括号后跟零或任意数量的空白字符后跟右括号
    • \) 将匹配右括号
    • \s+ 将匹配一个或多个空格字符

    确保将引擎作为python 传递以避免警告使用regex 作为分隔符,最后你会得到一个NaN 列,你可以直接删除:

    import pandas as pd
    from io import StringIO
    
    
    csv_data = '''1   (a b   c)  (a  b c)   (a b c)
    2 (a b c) (a b c)    (a b c)
    3       a b   c  a  b c   a b c'''
    
    df = pd.read_csv(StringIO(csv_data),
                    delimiter='\s*\(|\)\s*\(|\)|\s+', 
                    engine='python', 
                    header=None).dropna(axis=1)
    

    输出:

       0  1  2  3  4  5  6  7  8  9
    0  1  a  b  c  a  b  c  a  b  c
    1  2  a  b  c  a  b  c  a  b  c
    2  3  a  b  c  a  b  c  a  b  c
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 2018-03-14
      相关资源
      最近更新 更多