了解交换操作的最正则的方法是什么?

时间:2016-07-29 20:10:02

标签: python regex

我想解析1.05 * f和f * 1.05是等价的东西,其中f是固定字母,数字是任何正浮点数,*总是在'f'和浮点数之间(即乘法)。如果没有乘法,那也没关系,'f'因为整个字符串都没问题 - 所以'1.05 *'是可选的。请注意,1.05 * f * 1.05不起作用。 gf * 1.05不起作用,f * 1.05f应该破坏。

我正在使用python。我实际上很难让f * 1.05独立工作,因为f * 1.05f也可以工作 - 当我在选项乘法结束时放一个美元符号并浮动然后没有任何效果。

^f(\\*(\\d*[.])?\\d+)? # f*1.05 matches, but unfortunately so does f*1.05f
^f((\\*(\\d*[.])?\\d+)?)$ # the $ makes f*1.05f not match, but f*1.05 doesn't match either!

真的我的问题是关于是否有一种巧妙的方法可以让1.05 * f,f和f * 1.05一起工作而不使用'|'操作员可以选择浮动在左侧还是右侧。

2 个答案:

答案 0 :(得分:1)

使用多行修改器:

^(?:f\*\d*\.\d+|\d*\.\d+\*f|f)$

Live demo

答案 1 :(得分:-1)

对救援负面看待(前方):

pattern=r'((?!.*f\*)[\d.]+\*)?f((?<!\*f)\*[\d.]+)?'

s="""1.05*f*1.05
1.05*f
f*1.05
f"""

for line in s.split("\n"):
    if re.match(pattern, line):
        print("yay")
    else:
        print("nay")

打印:

nay
yay
yay
yay

说明:该模式由两个可选组(数字组)和中间的f组成。左侧组前面有一个负向前瞻,匹配任何字符序列,后跟f和星号。因此,如果字符串后面的某个字符后跟一个星号,那么这个前瞻不会匹配。整个组是可选的(?)。 f之后会再次出现相同的事情,但这次使用负面的lookbehind直接在它之前检查*f。如果它发现,该组不会匹配,这不会打破整个正则表达式,因为它再次是可选的。

我仍然不明白为什么你会这么想,|非常优越。