Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
针对多个字符串的Python正则表达式编译_Python_Regex_Python 3.x - Fatal编程技术网

针对多个字符串的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
this
re.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])