我想解析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一起工作而不使用'|'操作员可以选择浮动在左侧还是右侧。
答案 0 :(得分:1)
答案 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
。如果它发现,该组不会匹配,这不会打破整个正则表达式,因为它再次是可选的。
我仍然不明白为什么你会这么想,|
非常优越。