【问题标题】:Matching string on a condition using regex使用正则表达式在条件上匹配字符串
【发布时间】:2016-11-09 14:06:51
【问题描述】:

我有一个字符串例如:

s = 'Knorr 12x10g Fish bouillon cube'

我想使用正则表达式获得 12x10g 的部分。逻辑是找到第一个数字并将其扩展直到找到第一个空格。现在我只能用下面的正则表达式匹配这个特定的字符串。

val = re.findall(r'\s[0-9].x[0-9].g', s]

但我的数据中有 kg、ml 和其他类型的权重指标。所以这个正则表达式不适用于所有人。有什么建议么 ?谢谢。

【问题讨论】:

  • 单个示例通常是描述您希望正则表达式匹配的内容的一种非常糟糕的方式。

标签: python regex


【解决方案1】:

逻辑是找到第一个数字并将其扩展直到找到第一个空格。

您可以使用\d\S* 正则表达式:

import re
s = 'Knorr 12x10g Fish bouillon cube'
val = re.findall(r'\d\S*', s)
print(val)

Python demo

re.findall 方法将查找以数字 (\d) 开头的所有不重叠的子字符串,其后有 0+ 个字符而不是空格 (\S*)。如果非空白的数量不应为零,请将* 替换为+(出现1 次或多次)。

为避免匹配尾随标点,您可以在正则表达式模式的末尾添加\b (r'\d\S*\b')。

【讨论】:

  • 请注意,此正则表达式相当通用,您可能需要对其进行改进以更好地适应您的数据集。
  • 谢谢。只是为了知道。如果我想制作一个应该包含特定字符的正则表达式。例如,在这种情况下,如果我想制作应该包含“x”的正则表达式,然后是其余的逻辑,我该如何转换相同的正则表达式?
【解决方案2】:
\s[0-9]{1,}.x[0-9]{1,}[a-z]{1,}\s

在此之后,您可以选择将.strip() 用于派生字符串。

【讨论】:

    【解决方案3】:

    对于正则表达式:

    \d+\w\d+\w*(?=\s)
    

    演示:https://regex101.com/r/1orSGQ/1


    对于 Python

    import re
    text = '''s = 'Knorr 12x10g Fish bouillon cube'
    s = 'Knorr 12x10kg Fish bouillon cube'
    s = 'Knorr 12x10gram Fish bouillon cube'
    '''
    
    for m in re.finditer(r"\d+\w\d+\w*(?=\s)", text):
    
        print('%s' % (m.group(0)))
    

    输出

    12x10g
    12x10kg
    12x10gram
    

    【讨论】:

      猜你喜欢
      • 2017-12-23
      • 1970-01-01
      • 2023-01-30
      • 2012-06-05
      • 2013-12-25
      • 1970-01-01
      相关资源
      最近更新 更多