1

我正在编写一个小脚本,该脚本将匹配来自鞋标识符 (SKU) 的鞋码。

我希望能够处理一些情况。给定以下列表:

sizes = ['315122-603 10  A', '315122-608_12.0', '317982-019', '364781-019_5.5Y', 'V24088-001_10', '609048-035  8.5', '7-20Spm8231B5 10', 'G17295-001_9.5']

我希望能够获得每个喜欢的大小(10、12、5.5 等)。

我对正则表达式的了解非常有限,我一直在到处寻找一些片段并想出了以下内容

r = '\d{1,2}.\d+'
for size in sizes:
    re.findall(r, size)

['315122', '603']
['315122', '608', '12.0']
['317982', '019']
['364781', '019', '5.5']
['24088', '001']
['609048', '035', '8.5']
['7-20', '8231', '5 10']
['17295', '001', '9.5']

但如您所见,它不起作用。我希望能够只匹配小数点前和小数点后的数字,但只能匹配数字。

4

2 回答 2

3

几个问题:

  • .正则表达式中具有特殊含义。如果你真的想匹配一个点,你需要转义它。
  • 您可能希望点是可选的。
  • \D使用,\b或等技术检查匹配之前或之后是否没有更多数字(?!\d)
  • 您通常应该使用原始字符串来编写正则表达式模式,这样反斜杠序列就不会被解释为控制字符。
  • re.findall找到多个匹配项。如果您知道只有一场比赛,请使用re.search.

尝试这个:

pattern = r'\D(\d{1,2}(?:\.\d+)?)(?!\d)'

请注意,您的某些字符串包含下划线或没有小数分隔符。您还没有真正描述在这些情况下应该发生什么,并且此模式无法处理您示例中的所有情况,但它有望为您提供一个良好的开端。

您可能还需要考虑为每种输入类型编写不同的正则表达式,而不是尝试编写单个正则表达式来处理所有可能的输入。

于 2012-05-11T19:45:33.493 回答
0

您正在寻找的似乎是一个数字(数字、小数点和更多数字)的第一次出现,后面跟着一个空格或下划线。

所以

r'[ _](\d+(?:\.\d+)?)'
于 2012-05-11T21:01:46.383 回答