【发布时间】:2012-01-16 01:54:13
【问题描述】:
我会把它放在那里:我对正则表达式很糟糕。我试图想出一个来解决我的问题,但我真的不太了解它们。 . .
想象以下几行句子:
- 你好等等。大约 11 1/2" x 32"。
- 尺寸为 8 x 10-3/5!
- 可能在 22" x 17" 区域内的某个地方。
- 卷很大:42 1/2" x 60 码。
- 它们都是 5.76 x 8 帧。
- 是的,大概有 84 厘米长。
- 我认为是 13/19"。
- 不,实际上可能是 86 厘米。
我想尽可能清晰地从这些句子中提取项目尺寸。在完美的世界中,正则表达式将输出以下内容:
- 11 1/2" x 32"
- 8 x 10-3/5
- 22" x 17"
- 42 1/2" x 60 码
- 5.76 乘 8
- 84cm
- 13/19"
- 86 厘米
我想象一个适用以下规则的世界:
- 以下是有效单位:
{cm, mm, yd, yards, ", ', feet},但我更喜欢考虑任意单位集的解决方案,而不是上述单位的显式解决方案。 - 尺寸始终以数字形式描述,后面可能有也可能没有单位,可能有也可能没有小数部分或小数部分。允许单独由小数部分组成,例如,
4/5"。 - 小数部分总是有一个
/分隔分子/分母,并且可以假设部分之间没有空格(尽管如果有人考虑到这一点,那就太好了!)。 - 维度可以是一维或二维的,在这种情况下,可以假设以下对于分隔两个维度是可以接受的:
{x, by}。如果维度只是一维,它必须具有上述集合中的单位,即,22 cm可以,.333不是,4.33 oz也不是。
为了向你展示我在使用正则表达式时是多么的无用(并且为了展示我至少尝试过!),我做到了这一点。 . .
[1-9]+[/ ][x1-9]
更新(2)
你们非常快速和高效!我将在下面的正则表达式中添加一些额外的测试用例:
- 最后一个测试用例是 12 yd x。
- 最后一个测试用例是 99 厘米。
- 这句话中没有维度:342 / 5553 / 222。
- 三个维度? 22" x 17" x 12 厘米
- 这是一个产品代码:c720 与另一个数字 83 x 更好。
- 一个独立的数字 21。
- 体积不应匹配 0.332 盎司。
这些应该导致以下结果(# 表示不应该匹配):
- 12 码
- 99 厘米
- #
- 22" x 17" x 12 厘米
- #
- #
- #
我已将下面的M42's 答案改编为:
\d+(?:\.\d+)?[\s-]*(?:\d+)?(?:\/\d+)?(?:cm|mm|yd|"|'|feet)(?:\s*x\s*|\s*by\s*)?(?:\d+(?:\.\d+)?[\s*-]*(?:\d+(?:\/\d+)?)?(?:cm|mm|yd|"|'|feet)?)?
虽然这解决了一些新的测试用例,但它现在无法匹配以下其他测试用例。它报告:
- 11 1/2" x 32" 通过
- (无)失败
- 22" x 17" 通行证
- 42 1/2" x 60 码通行证
- (无)失败
- 84cm 合格
- 13/19" 传球
- 86 厘米通过
- 22" 通行证
- (无)失败
(无)失败
12 码 x 失败
- 99 厘米失败
- 22" x 17" [还有,但分别为 '12 cm'] 不合格
通过
通过
【问题讨论】:
-
能否请您提供输入字符串以及预期的输出?
-
当然。我在这里为您提供了一种更简单的格式:pastebin.com/txfJs8LX 非常感谢!
标签: regex parsing text nlp text-extraction