针对多个字符串的Python正则表达式编译
我试图在数据下面实现一个模式针对多个字符串的Python正则表达式编译,python,regex,python-3.x,Python,Regex,Python 3.x,我试图在数据下面实现一个模式 ----------------------------------------------- | COLUMN_NAME | DATA_TYPE | ----------------------------------------------- | C460 | VARCHAR2 | | C459 | CLOB
-----------------------------------------------
| COLUMN_NAME | DATA_TYPE |
-----------------------------------------------
| C460 | VARCHAR2 |
| C459 | CLOB |
| C458 | VARCHAR2 |
| C8 | BLOB |
| C60901 | INT |
我可以创建模式
来选择列名称
,其中CLOB,BLOB
匹配,但我还需要INT
数据类型的列名称
。
在这种情况下,我应该得到C459、C8、C60901
使用下面的代码我只得到了C60901
,因为我使用了
,它只不过是或
,但我想要列的名称
用于CLOB
和INT
C459,C8,C60901
#current code
COl_Re=re.compile('(?m)(C\d+ )(?=.+ NUMBER | [C]LOB)')
columns=COl_Re.findall(proc.stdout.read())
我从本文档中获得了帮助,但我无法找到可靠的答案。我假设您只想获取列名称中的值,其中数据类型为CLOB或INT。这将为您提供以下列表:
>>> text="""-----------------------------------------------
| COLUMN_NAME | DATA_TYPE |
-----------------------------------------------
| C460 | VARCHAR2 |
| C459 | CLOB |
| C458 | VARCHAR2 |
| C8 | BLOB |
| C60901 | INT |"""
>>> import re
>>> re.findall(re.compile("\| (\S+)\s*\| (?:CLOB|INT).*"),text)
['C459', 'C60901']
这对我来说在Python 3.5.2上是可行的,在Python的re模块中有一个详细选项,我非常喜欢。代码应该是自解释的(根据3.6检查) 这应该给你['C459','C8','C60901'],这就是你所追求的。一旦理解了,您就可以编写:
r'(C\d+(:.*(:INT | CLOB | BLOB))”
。然而,对于冗长和特定的匹配(空格和管道字符),可以说滥用
通常会导致正则表达式匹配我做梦也想不到的事情
真的,你不应该做上述任何一件事!伟大的黑客杰米·扎温斯基曾经说过:
有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有两个问题
如果您能够逐行处理输入,我会这样做:
result = []
interesting_columns = ('INT', 'CLOB', 'BLOB')
for line in data:
fields = line.split()
if any(col in fields for col in interesting_columns):
result.append(fields[1])
我真的不明白这个问题。你能再校对一遍吗?你的代码输出为0。但是我的代码COl_Re=Re.compile(“(?m)(C\d+)(=.+[I]NT |[CB]LOB)”只提供int列,而不提供BLOB或CLOB的结果。是的,如果数据类型符合我的要求,那么我只需要列名。在本例中,CLOB和INTI很抱歉,我无法重现你的问题。我已经再次验证了我的代码并更新了我的答案。您使用的是哪种python版本?我使用的是python 3.6In
python 2.7
thisre.findall(re.compile(\\\\s*(\s+)\s*\\\\\s*(?:[CB]LOB | INT)。*”,text)
匹配['C459',C8',C60901']
result = []
interesting_columns = ('INT', 'CLOB', 'BLOB')
for line in data:
fields = line.split()
if any(col in fields for col in interesting_columns):
result.append(fields[1])