regex Python 3中的连接正则表达式

ca1c2owp  于 2023-03-24  发布在  Python
关注(0)|答案(1)|浏览(128)

使用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+ ")$"

我的主要想法是创建一个模式,允许operperm之间的连接,然后再次连接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"不应该匹配。
任何帮助都是受欢迎的。

66bbxpm5

66bbxpm51#

我会从一个类型和(二进制)操作符开始,然后慢慢地构建。对于int和二进制+,我们会得到如下内容:

import re

int = r"[1-9][0-9]*" # not exactly correct, `0` and `00000` are an int in python and many others not included here.
                     # also notice your current int requires two digits!
                     # maybe 0|[1-9]\d* would be better (taken from JSON spec)
plus = r'\+'

# to start, maybe we can match the pattern: int space* plus space* int
regex = re.compile(fr'^{int}\s*{plus}\s*{int}$')
for pattern in ["3+4", "3++4", "3 + 4"]:
    print (pattern, regex.match(pattern))

# 3+4    <re.Match object; span=(0, 3), match='3+4'>
# 3++4   None
# 3 + 4  <re.Match object; span=(0, 5), match='3 + 4'>

相关问题