使用VSCode,最新版本的Python -V:3.1(64位)
我正在尝试编写一些必须用正则表达式编写的代码,它基本上必须检查良好的代码格式。
例如,我必须创建一个匹配"3+4"
这样的表达式的模式。
- (我不会在下面的代码中包含
import re
,但请记住它是在原始代码中实现的)*
考虑到这一点,我创建了以下模式:
var = r"^[a-zA-Z][a-zA-Z0-9]*$"
int1 = r"^[1-9][0-9]*$"
bool1 = r"^(True|False)$"
string = r"^#[a-zA-Z0-9]+#$"
sum1 = r'^\s*\+\s*$'
sub = r'^\s*\-\s*$'
prod = r'^\s*\*\s*$'
dif = r'^\s*\<\s*$'
div = r'^\s*\/\s*$'
eq= r'^\s*==\s*$'
我需要创建一个模式,至少匹配像"3+4"
这样的字符串。在我实现了这一点之后,我可以继续匹配其他类型的字符串,比如"#hello# = 10 / x"
,但现在,让这篇文章专注于提到的第一个字符串。
为此,我创建了以下模式:
perm = r"^(" + int1 + r"|" + bool1+ r"|" + string + r"|" + var+ ")$"
oper = r"^(" + sum1+ r"|" + sub+ r"|" + prod + r"|" + dif + r"|" + div + r"|" + eq+ ")$"
我的主要想法是创建一个模式,允许oper
和perm
之间的连接,然后再次连接oper
。
我对这件事有基本的了解,所以在尝试了许多不同的选择之后,我已经没有办法了。
"我试过以下几种"
一个一个二个一个一个一个三个一个一个一个一个一个四个一个
但似乎都不管用。
我使用提到的第一个字符串作为例子,我得到了相同的结果:
代码:
str = "3+4"
print(re.match(perm, str[0]))
print(re.match(oper, str[1]))
print(re.match(perm, str[2]))
print(re.match(oper_bin, str))
print(re.findall(oper_bin, str))
输出:
<re.Match object; span=(0, 1), match='3'>
<re.Match object; span=(0, 1), match='+'>
<re.Match object; span=(0, 1), match='4'>
None
[]
"3 + 4"
也应该匹配,但"3++4"
不应该匹配。
任何帮助都是受欢迎的。
1条答案
按热度按时间66bbxpm51#
我会从一个类型和(二进制)操作符开始,然后慢慢地构建。对于
int
和二进制+
,我们会得到如下内容: