需要正则表达式才能在python中仅获取表名和主键
也许这个问题很傻,但我无法生成正则表达式来获取表名和主键 表: 我正在使用:需要正则表达式才能在python中仅获取表名和主键,python,regex,Python,Regex,也许这个问题很傻,但我无法生成正则表达式来获取表名和主键 表: 我正在使用: begin=re.compile(r“CREATE TABLE[\”]*([^\“]+)[\”]*[([^/;]+)[/;]”),re.IGNORECASE)获取所有表名和数据 但我只需要具有表名和主键的数据 预期输出: dhcpr_dhcprelayinterface PRIMARY KEY(ifName,vrId) 我相信你可以用正则表达式或函数来解决这个问题,但这里有一个“有趣”的方法来解决这个问题,只是出于教
begin=re.compile(r“CREATE TABLE[\”]*([^\“]+)[\”]*[([^/;]+)[/;]”),re.IGNORECASE)
获取所有表名和数据
但我只需要具有表名和主键的数据
预期输出:
dhcpr_dhcprelayinterface
PRIMARY KEY(ifName,vrId)
我相信你可以用正则表达式或函数来解决这个问题,但这里有一个“有趣”的方法来解决这个问题,只是出于教育目的-使用内存数据库-实际创建表并从中获取
表名
,主键列来自:
印刷品:
dhcpr_dhcprelayinterface
['ifName', 'vrId']
我相信你可以用正则表达式或函数来解决这个问题,但这里有一个“有趣”的方法来解决这个问题,只是出于教育目的-使用内存数据库-实际创建表并从中获取
表名
,主键列来自:
印刷品:
dhcpr_dhcprelayinterface
['ifName', 'vrId']
您可以使用它来获取表名和主键
begin = re.compile(r"CREATE TABLE[ ']*([^ ']+)[ ']*[(][^/;]+(PRIMARY KEY.*),[^/;]+;$", re.IGNORECASE)
begin.findall(YOUR_STR)
产出:
In [1]: a = """CREATE TABLE 'dhcpr_dhcprelayinterface' (
...: 'vrId' integer default 0,
...: 'ifName' string ,
...: PRIMARY KEY(ifName,vrId),
...: FOREIGN KEY (vrId) REFERENCES 'vr_vr'(vrId) ON DELETE CASCADE ON
UPDATE CASCADE);"""
In [2]: begin = re.compile(r"CREATE TABLE[ ']*([^ ']+)[ ']*[(][^/;]+(PRIMARY KEY.*),[^/;]+;$", re.IGNORECASE)
In [3]: begin.findall(a)
Out[3]: [('dhcpr_dhcprelayinterface', 'PRIMARY KEY(ifName,vrId)')]
您可以使用它来获取表名和主键
begin = re.compile(r"CREATE TABLE[ ']*([^ ']+)[ ']*[(][^/;]+(PRIMARY KEY.*),[^/;]+;$", re.IGNORECASE)
begin.findall(YOUR_STR)
产出:
In [1]: a = """CREATE TABLE 'dhcpr_dhcprelayinterface' (
...: 'vrId' integer default 0,
...: 'ifName' string ,
...: PRIMARY KEY(ifName,vrId),
...: FOREIGN KEY (vrId) REFERENCES 'vr_vr'(vrId) ON DELETE CASCADE ON
UPDATE CASCADE);"""
In [2]: begin = re.compile(r"CREATE TABLE[ ']*([^ ']+)[ ']*[(][^/;]+(PRIMARY KEY.*),[^/;]+;$", re.IGNORECASE)
In [3]: begin.findall(a)
Out[3]: [('dhcpr_dhcprelayinterface', 'PRIMARY KEY(ifName,vrId)')]
使用python2.7对以下各项进行了测试:
>>> table_string = """
... CREATE TABLE 'dhcpr_dhcprelayinterface' (
... 'vrId' integer default 0,
... 'ifName' string ,
... PRIMARY KEY(ifName,vrId),
... FOREIGN KEY (vrId) REFERENCES 'vr_vr'(vrId) ON DELETE CASCADE ON UPDATE CASCAD
E);"""
>>> p = r'CREATE TABLE\s+\'([^\']+)[\s\S]+PRIMARY KEY\(([^,]+),([^\)]+)\)'
>>> re.findall(p,table_string)
[('dhcpr_dhcprelayinterface', 'ifName', 'vrId')]
可以找到解释使用python2.7测试了以下内容:
>>> table_string = """
... CREATE TABLE 'dhcpr_dhcprelayinterface' (
... 'vrId' integer default 0,
... 'ifName' string ,
... PRIMARY KEY(ifName,vrId),
... FOREIGN KEY (vrId) REFERENCES 'vr_vr'(vrId) ON DELETE CASCADE ON UPDATE CASCAD
E);"""
>>> p = r'CREATE TABLE\s+\'([^\']+)[\s\S]+PRIMARY KEY\(([^,]+),([^\)]+)\)'
>>> re.findall(p,table_string)
[('dhcpr_dhcprelayinterface', 'ifName', 'vrId')]
解释如下此解决方案解决了一些您似乎不担心的问题(但值得担心的是)例如,SQLite允许您将转义的
'
写为'
,在创建和表之间,以及主,键和之间,可能有任意数量的空格,甚至换行符(
:
输出:
('dhcpr_dhcprelayinterface', 'PRIMARY KEY(ifName,vrId)')
此解决方案解决了一些您似乎不担心的问题(但哪些问题值得担心)例如,SQLite允许您将转义的'
写为'
,在创建和表之间,以及主,键和之间,可能有任意数量的空格,甚至换行符(
:
输出:
('dhcpr_dhcprelayinterface', 'PRIMARY KEY(ifName,vrId)')
我尝试使用上面的表达式,但它不起作用。谢谢。是否可以使用begin.search(a)而不是findall()打印数据?是的,使用match=begin.search(a)
返回匹配对象,然后使用match.groups()获取数据
我有一个变量a,您正在使用它作为一个非常大的SQL语句字符串。我使用了代码的其余部分,但它完全不适用于我。我没有得到任何返回。我尝试使用上面的表达式,但它不起作用。谢谢。是否可以使用begin.search(a)而不是findall()打印数据是的,使用match=begin.search(a)
返回一个匹配对象,然后使用match.groups()获取数据
我有一个变量a,您正在使用它作为一个非常大的SQL语句字符串。我使用了代码的其余部分,但它完全不适用于我。我没有得到任何返回。感谢您的良好解释。如果您有想法,请提供regrex表达式。感谢您的良好解释。您可以提供regrex express吗ion如果你有想法。谢谢,是否可以使用re.search()获得输出operation@rishinarian:是。re.search
将扫描字符串以查找与模式的匹配,返回匹配对象,如果未找到匹配对象,则返回“无”。因此,您可以执行m=re.search(p,table_string)
,然后打印[m.group(i+1)对于范围(3)中的i)
。输出为:['dhcpr\u dhcprelayinterface','ifName','vrId']
。谢谢,可以使用re.search()获取输出吗 operation@rishinarian:是。re.search
将扫描字符串以查找与模式的匹配项,如果未找到匹配项,则返回匹配对象,或者不返回。因此,您可以执行m=re.search(p,table_string)
,然后为范围(3)中的i打印[m.group(i+1)]
。输出为:['dhcpr\u dhcprelayinterface','ifName','vrId']
。