我正在尝试从文本中提取尺寸和单位。
数据可能看起来像任何东西:
53 英寸 x 45 英寸
10 英寸乘 5 英寸
53" 宽 x 74" 长 x 15" 高
53 英寸宽 x 74 英寸长 x 15 英寸高
有一些帖子涵盖了前两种情况,但我无法理解如何处理这里的情况 3 和 4。
这是我尝试了从基础做起这个,但不知它不工作:
import re
regex = r"(?<!\S)\d+(?:,\d+)?\s*(?:inch|in| in|\")* ?x ?\d+(?:,\d+)?(?: ?x ?\d+(?:,\d+)?)*\s*(?:inch| inch|in| in|\")*"
test_str = ("15 mm x 2 mm x 3")
result = re.findall(regex, test_str)
print(result)
Run Code Online (Sandbox Code Playgroud)
另外,我只想提取这些,因为我正在使用Quantulum来提取其他数值,但在这种情况下它失败了。因此,非常感谢有关如何合并这两个事物以共同发挥作用的任何指导。
谢谢你的帮助
您可以使用
(?<!\S)(\d+(?:,\d+)?) *(?:(?:in(?:ch)?|")(?: +W)?)? ?(?:x|by) ?(\d+(?:,\d+)?)(?: ?x ?\d+(?:,\d+)?)* *(?:(?:in(?:ch)?|")(?: +L)?)?(?: ?x ?(\d+(?:,\d+)?))* *(?:(?:in(?:ch)?|")(?: +H)?)?
Run Code Online (Sandbox Code Playgroud)
请参阅正则表达式演示。
当然,\s比模式中的文字空格更好,因为它可以匹配任何空格:
(?<!\S)(\d+(?:,\d+)?)\s*(?:(?:in(?:ch)?|")(?:\s+W)?)?\s?(?:x|by)\s?(\d+(?:,\d+)?)(?:\s?x\s?\d+(?:,\d+)?)*\s*(?:(?:in(?:ch)?|")(?:\s+L)?)?(?:\s?x\s?(\d+(?:,\d+)?))*\s*(?:(?:in(?:ch)?|")(?:\s+H)?)?
Run Code Online (Sandbox Code Playgroud)
细节:
(?<!\S)- 左侧空白边界(\d+(?:,\d+)?)- 第 1 组:int 或 float 数值 *- 零个或多个空格(?:(?:in(?:ch)?|")(?: +W)?)?- 可选的in,inch或序列",可选地后跟一个或多个空格以及W ?- 可选空间(?:x|by)-x或者by ?- 可选空间(\d+(?:,\d+)?)(?: ?x ?\d+(?:,\d+)?)* *(?:(?:in(?:ch)?|")(?: +L)?)?(?: ?x ?(\d+(?:,\d+)?))* *(?:(?:in(?:ch)?|")(?: +H)?)?- 如上所述的类似模式序列的两个可选重复(使用L和H代替W),数值被捕获到组 2 和组 3 中。