【问题标题】:Python Regex-Keep Alpha Characters Continuously Adjacent/Inside Numeric SequencesPython Regex-保持字母字符连续相邻/在数字序列内
【发布时间】:2018-08-22 19:04:28
【问题描述】:

我正在尝试从 pandas 中非常混乱的字符串字段中提取型号。复杂之处在于,这些序列号不仅是数字,而且有时是字母数字。我想要完成的是创建一个正则表达式捕获组/组合,它允许我仅在字母字符连续位于之前、结尾或位于数字序列内时捕获它们:

model_number
part b: 101-03-0458B
B.2017Z brand name
brand - 027xY21

model_number_stripped
101030458B
B2017Z
027xY21 

到目前为止,我有以下内容:

df['model_number_stripped'] = df['model_number'].str.replace('-','').str.replace('.','').str.replace('\D+','')

【问题讨论】:

  • 这似乎很困难,因为第二行中的B 在技术上与2017Z 并不相邻,但是您想要捕获它,而您不想捕获d在第三行中,也仅由数字中的特殊字符分隔。例如,如果第三行是 brand.027xY21 我只是看不出如何将其与第二行区分开来,除非您有一些额外的信息,例如您要捕获的字母字符将始终大写,并且可以最多只能连续 X 个。
  • 这个问题太笼统了。 “部分”也是字母数字。 “品牌”也是如此。一个人应该怎么知道你在寻找什么样的代码。
  • @ALollz 是的,这很棘手。我修复了第三行示例以简化(因为它不会发生在真实数据集中)。没关系,所以去掉字符“。”和'-'首先。
  • @coldspeed 澄清一下,我希望它只保留字母字符,只要它们在去掉“。”后“触摸”数字。和 '-' 字符。
  • @WiktorStribiżew 很高兴并赞成。你给出了一个很好的综合答案。

标签: python regex pandas


【解决方案1】:

你可以使用

df['model_number_stripped'] = df['model_number'].str.replace(r'\W+|(?<!\d)[^\W\d_](?![^\s\d]*\d)', '')

看到这个regex demo

详情

  • \W+ - 除字母、数字和 _ 之外的 1 个或多个字符(如果要删除 _,请使用 [\W_]+
  • | - 或
  • (?&lt;!\d)[^\W\d_](?![^\s\d]*\d) - 任何前面没有数字 ((?&lt;!\d)) 且后面没有除空格和数字 ([^\s\d]*) 之外的任何 0+ 字符后跟数字 (\d) 的字母 ([^\W\d_]) .请注意,(?&lt;!\d) 是一个否定的后视,紧靠当前位置的左侧,要求没有数字。 (?![^\s\d]*\d) 模式是一个负前瞻,如果在当前位置的右侧找到其模式,则匹配失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2020-03-20
    • 2012-01-26
    相关资源
    最近更新 更多