【问题标题】:Regular expression python dataframe element正则表达式 python 数据框元素
【发布时间】:2016-09-29 21:10:07
【问题描述】:

我在这里有一个问题(回答得很好): Python parse dataframe element

很遗憾,我的数据源还有其他情况需要处理。

当前模式是

pattern = r'([^\(]+)(\(([^,]*),(.*)\))?'

trans_field_attr = df['Data Type'].str.extract(pattern, expand=True).iloc[:, [0, 2, 3]]

这可以完美地处理(精度,比例)版本,例如 NUMBER(22,4)。不幸的是,它不会选择括号中只有一个值的任何值。

例如:

0        VARCHAR2(1)
1        VARCHAR2(1)
2        VARCHAR2(1)
3        VARCHAR2(1)
4        VARCHAR2(1)
5            DATE(7)
6            DATE(7)
7            DATE(7)
8            DATE(7)
9        VARCHAR2(1)
10           DATE(7)
11       VARCHAR2(3)
12       VARCHAR2(3)
13               NaN
14       VARCHAR2(3)
15      NUMBER(22,4)

如何改进模式以获取单个值?

抱歉,但我真的很难从 piRSquared 的回答中走得更远......

【问题讨论】:

    标签: python regex parsing pandas


    【解决方案1】:

    为第二个数字和逗号添加一个非捕获组,然后在其后添加一个? 零或一个标记,如下所示。

    ([^\(]+)(\(([^,]*)(?:,(.*))?\))?
                      (?:     )? <= this part means that the comma and everything following it
                                    is optional, alike to the ? token at the very end.
    

    【讨论】:

    • 请注意,如果您想要更具可扩展性的东西,值得查看 Oz123 的答案。 (假设您希望括号之间的值超过 2 个。)
    【解决方案2】:

    如果你只是想提取括号之间的数字,你可以使用一个非常简单的版本:

    In [2]: rgx=re.compile("\w+\((?P<num>\d*\,*\d*)")
    In [5]: m=rgx.match("VARCHAR(22,22)")
    In [10]: m.groupdict()
    Out[10]: {'num': '22,22'}
    
    In [16]: m=rgx.match("VARCHAR(22)")
    In [17]: m.groupdict()['num']
    Out[17]: '22'
    

    【讨论】:

    • 可能值得一提的是,这将需要额外的解析(类似于.groupdict()['num]).split(',')),因为 OP 似乎想要拆分每个元素。
    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 2021-04-10
    • 2019-06-02
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多