【问题标题】:Does anybody understand why this doesn't compile?有人明白为什么这不能编译吗?
【发布时间】:2011-12-28 01:10:29
【问题描述】:

我正在尝试使用这种模式解析 svg 路径 W3C SVG Paths 编辑:好的,我已经改变了我的模式并且有一个新问题的示例。看我有一些东西可以使用新模式。我现在正在研究line_to 正则表达式,svg 规范要求值能够支持一个点,例如:L100,200 到很多点,例如:L100,200 100,400 0,100 我似乎无法让它工作。我正在解析inkscape_path2 并接收这样的输出。

我们只查看输出的第一个元组:

这就是我得到的:

('L 6,82 ','L ','6','82')

这就是我想要得到的:

('L 6,82 6,14 6,12 ','L ','6','82','6','14','6','12')

实际代码:

from PyQt4.QtGui import QPainterPath
import string,re

inkscape_path1 = "M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.71875,-0.375 -0.00741,-0.0044 -0.023866,0.0045 -0.03125,0 -0.031933,-0.0193 -0.062293,-0.04251 -0.09375,-0.0625 -0.120395,-0.0767 -0.2310226,-0.163513 -0.34375,-0.25 -0.1061728,-0.0808 -0.2132809,-0.161112 -0.3125,-0.25 C 8.4783201,88.557317 8.3087904,88.373362 8.15625,88.1875 8.0486711,88.057245 7.9378561,87.922215 7.84375,87.78125 7.818661,87.74287 7.805304,87.69538 7.78125,87.65625 7.716487,87.553218 7.6510225,87.451733 7.59375,87.34375 7.4927417,87.149044 7.3880752,86.928049 7.3125,86.71875 7.30454,86.69694 7.288911,86.6782 7.28125,86.65625 7.2494249,86.5643 7.2454455,86.469419 7.21875,86.375 7.1884177,86.268382 7.1483606,86.171969 7.125,86.0625 7.0521214,85.720988 7,85.364295 7,85 L 7,83 7,15 7,13 C 7,10.218152 9.2181517,8 12,8 l 2,0 68,0 2,0 c 2.781848,0 5,2.218152 5,5 l 0,2 0,68 0,2 c 0,0.364295 -0.05212,0.720988 -0.125,1.0625 -0.04415,0.206893 -0.08838,0.397658 -0.15625,0.59375 -0.0077,0.02195 -0.0233,0.04069 -0.03125,0.0625 -0.06274,0.173739 -0.138383,0.367449 -0.21875,0.53125 -0.04158,0.0828 -0.07904,0.169954 -0.125,0.25 -0.0546,0.09721 -0.126774,0.18835 -0.1875,0.28125 -0.09411,0.140965 -0.204921,0.275995 -0.3125,0.40625 -0.143174,0.17445 -0.303141,0.346998 -0.46875,0.5 -0.01117,0.0102 -0.01998,0.02115 -0.03125,0.03125 -0.138386,0.125556 -0.285091,0.234436 -0.4375,0.34375 -0.102571,0.07315 -0.204318,0.153364 -0.3125,0.21875 -0.0074,0.0045 -0.02384,-0.0044 -0.03125,0 -0.232039,0.138728 -0.462548,0.274778 -0.71875,0.375 0.301527,-0.0968 0.596455,-0.204138 0.875,-0.34375 0.55709,-0.279224 1.060053,-0.665694 1.5,-1.09375 0.219973,-0.214028 0.409366,-0.441865 0.59375,-0.6875 0.184384,-0.245635 0.355408,-0.507743 0.5,-0.78125 0.14012,-0.265048 0.276135,-0.524729 0.375,-0.8125 0.01041,-0.03078 0.02133,-0.06274 0.03125,-0.09375 0.09046,-0.278085 0.1388,-0.579404 0.1875,-0.875 C 89.95865,84.6507 90,84.334721 90,84 l 0,-2 0,-68 0,-2 C 90,8.676 87.324,6 84,6 L 12,6 z"

inkscape_path2 = "M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.6695391,6.580022 9.4375,6.71875 c -0.00741,0.0044 -0.023866,-0.0045 -0.03125,0 -0.031933,0.0193 -0.062293,0.04251 -0.09375,0.0625 -0.120395,0.0767 -0.2310226,0.163513 -0.34375,0.25 -0.1061728,0.0808 -0.2132809,0.161112 -0.3125,0.25 C 8.4783201,7.442683 8.3087904,7.626638 8.15625,7.8125 8.0486711,7.942755 7.9378561,8.077785 7.84375,8.21875 7.818661,8.25713 7.805304,8.30462 7.78125,8.34375 7.716487,8.446782 7.6510225,8.548267 7.59375,8.65625 7.4927417,8.850956 7.3880752,9.071951 7.3125,9.28125 7.30454,9.30306 7.288911,9.3218 7.28125,9.34375 7.2494249,9.4357 7.2454455,9.530581 7.21875,9.625 7.1884177,9.731618 7.1483606,9.828031 7.125,9.9375 7.0521214,10.279012 7,10.635705 7,11 l 0,2 0,68 0,2 c 0,2.781848 2.2181517,5 5,5 l 2,0 68,0 2,0 c 2.781848,0 5,-2.218152 5,-5 l 0,-2 0,-68 0,-2 C 89,10.635705 88.94788,10.279012 88.875,9.9375 88.83085,9.730607 88.78662,9.539842 88.71875,9.34375 88.71105,9.3218 88.69545,9.30306 88.6875,9.28125 88.62476,9.107511 88.549117,8.913801 88.46875,8.75 88.42717,8.6672 88.38971,8.580046 88.34375,8.5 88.28915,8.40279 88.216976,8.31165 88.15625,8.21875 88.06214,8.077785 87.951329,7.942755 87.84375,7.8125 87.700576,7.63805 87.540609,7.465502 87.375,7.3125 87.36383,7.3023 87.35502,7.29135 87.34375,7.28125 87.205364,7.155694 87.058659,7.046814 86.90625,6.9375 86.803679,6.86435 86.701932,6.784136 86.59375,6.71875 c -0.0074,-0.0045 -0.02384,0.0044 -0.03125,0 -0.232039,-0.138728 -0.462548,-0.274778 -0.71875,-0.375 0.301527,0.0968 0.596455,0.204138 0.875,0.34375 0.55709,0.279224 1.060053,0.665694 1.5,1.09375 0.219973,0.214028 0.409366,0.441865 0.59375,0.6875 0.184384,0.245635 0.355408,0.507743 0.5,0.78125 0.14012,0.265048 0.276135,0.524729 0.375,0.8125 0.01041,0.03078 0.02133,0.06274 0.03125,0.09375 0.09046,0.278085 0.1388,0.579404 0.1875,0.875 C 89.95865,11.3493 90,11.665279 90,12 l 0,2 0,68 0,2 c 0,3.324 -2.676,6 -6,6 l -72,0 z"
w3c_path1 = "M100,200 C100,100 250,100 250,200 S400,300 400,200"
w3c_path2 = '''
           M600,350 l 50,-25 \n
           a25,25 -30 0,1 50,-25 l 50,-25 \n
           a25,50 -30 0,1 50,-25 l 50,-25 \n
           a25,75 -30 0,1 50,-25 l 50,-25 \n
           a25,100 -30 0,1 50,-25 l 50,-25 \n
           '''

  if __name__ == '__main__':
    data = inkscape_path2
    assert re.match('M', data)
    integer = r'-\d+|\d+' # A negative or positive set of digits of unknown length
    float = r'-\d+\.\d+|\d+\.\d+' # The same as above but looks for a decimal
    number = r'({}|{})'.format(integer, float) 
    point = r'{},{}'.format(number, number)
    move_to = r'([Mm]\s*){}'.format(point)
    line_to = r'(([Ll]\s*){}+\s)'.format(point)
    curve_to = r'(([Cc]\s*){}\s{}\s{})'.format(point, point, point)
    t = re.findall(line_to, data)
    for token in t: # we're only testing line_to right now move_to some what works.
        print(token)
    print(data)
    print(line_to)

【问题讨论】:

  • 向我们展示您对 path_pattern 所做的工作,它在什么时候发生故障,以及您得到的结果不是预期的结果。
  • @Christopher 你必须解释你对......“这个”机器的意图是什么,因为它很奇怪而且难以理解。你打算用这些散落在各处的?p=point 得到什么?而这个枚举(?P=point)|(?P=move_to)|(?P=close_path)|..... ??!请注意,使用三引号符号会在模式中引入换行符和空格,我怀疑这是否是您想要的。
  • @Christopher 我阅读了链接页面。现在我更了解你的模式,但还不足以回答。

标签: python regex svg python-3.x


【解决方案1】:

您没有提供任何代码、实际错误消息、示例输入或其他任何内容。所以我只是猜测:

我不相信您可以在匹配组之外使用 ?P<label> 语法。所以当你有这个时:

?P<point>(\d[(,)|\s]\d)

你确实需要这些:

(?P<point>(\d[(,)|\s]\d))

请注意包含整个表达式的额外括号。仅举这个例子:

>>> re.compile('''?P<point>(\d[(,)|\s]\d)''')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/re.py", line 190, in compile
    return _compile(pattern, flags)
  File "/usr/lib64/python2.7/re.py", line 244, in _compile
    raise error, v # invalid expression
sre_constants.error: nothing to repeat

对比:

>>> re.compile('''(?P<point>(\d[(,)|\s]\d))''')
<_sre.SRE_Pattern object at 0x7f8b14a3fa80>

【讨论】:

  • (?P&lt;point&gt;\d[(,)|\s]\d) 就够了,而不是(?P&lt;point&gt;(\d[(,)|\s]\d))
  • 真实数据。事实上,通过添加新的括号,而不是简单地移动一个,你最终会得到额外的匹配组......这不应该有任何影响,因为 OP 使用的是命名匹配。不过,很好的收获。
猜你喜欢
  • 1970-01-01
  • 2011-06-08
  • 2020-03-28
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 2012-07-06
相关资源
最近更新 更多