Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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 - Fatal编程技术网

Python正则表达式返回以特定字符串开头的行

Python正则表达式返回以特定字符串开头的行,python,regex,Python,Regex,我有这个文件(output.txt) 我可以在用户名和域之后获取值 traider,domain.net traider1,domain.net 但我不知道如何得到TECH-XXX 期望输出: traider,domain.net,TECH-1366 traider1,domain.net,TECH-1367 代码: 我只能返回[TECH],但它不完整,有括号 tech = re.findall(r'TECH-*', data) 试一试 为此,您不需要a,您可以使用内置的,例如a来“

我有这个文件(output.txt)

我可以在用户名和域之后获取值

 traider,domain.net
 traider1,domain.net
但我不知道如何得到TECH-XXX

期望输出:

traider,domain.net,TECH-1366
traider1,domain.net,TECH-1367
代码:

我只能返回[TECH],但它不完整,有括号

tech =  re.findall(r'TECH-*', data)
试一试

为此,您不需要a,您可以使用内置的,例如a来“捆绑”您的数据:

txt="""Username:traider

domain:domain.net


TECH-1366


Username:traider1

domain:domain.net


TECH-1367"""

l = txt.split()

#udt = [ l[i:i + 3] for i in range(0, len(l), 3)]
# equivalent to list-comprehension above
udt = []
for i in range(0, len(l), 3):
    udt.append( l[i:i + 3] )

print(udt)
印刷品

[['Username:traider', 'domain:domain.net', 'TECH-1366'], ['Username:traider1', 'domain:domain.net', 'TECH-1367']]
traider,domain.net,TECH-1366
traider1,domain.net,TECH-1367

如需打印,请执行以下操作:

for e in udt:
    print(",".join(map(lambda f:f.split(":")[-1], e)))
印刷品

[['Username:traider', 'domain:domain.net', 'TECH-1366'], ['Username:traider1', 'domain:domain.net', 'TECH-1367']]
traider,domain.net,TECH-1366
traider1,domain.net,TECH-1367
并结合

d = [e.split(":")[-1] for e in txt.split()]
for i in range(0, len(d), 3):
    print( ",".join(d[i:i+3]) )

这可以通过将文本拆分为多个项目来实现,进一步拆分以获得每个项目中的有用文本,然后进行一些简单的条件格式设置:

txt="""Username:traider

domain:domain.net


TECH-1366


Username:traider1

domain:domain.net


TECH-1367"""

out = ''
for item in txt.split():
    desired_value = item.split(':')[-1]
    out += desired_value
    if ':' in desired_value:
        out += ','           
    else:
        out += '\n'
或使用理解:

''.join('%s,' % item.split(':')[-1] if ':' in item else '%s\n' % item for item in txt.split())
输出:

traider,domain.net,TECH-1366
traider1,domain.net,TECH-1367

终于找到了为什么上面什么都不起作用:这是因为我的文件中有
^M
仅当在vim中打开时才可见,使用cat打开时不可见,使用

sys.stdout = open('out.txt','wt')
with open ("output.txt", "r") as myfile:
  data=myfile.read()
print data.replace('\r','')
并使用@Wiktor Stribiżew代码:

people = re.findall(r'\bUsername:(\S+)\s+domain:(\S+)\s+First Name:(\S+)\s+Last Name:(\S+)\s+(TECH-\d+)', data)

我得到了想要的结果,谢谢大家

完成你现在的模式,试过了吗?它起作用了吗?还是应该明确检查
TECH-\d+
?然后用此替换上面的
+
re.findall(r'\bUsername:(\S+)\S+域:(\S+)\S+(TECH-\d+),数据)
,并且不需要匹配以TECHSee开头的行。什么意思,你没有得到任何需要匹配的线开始与技术?不要添加任何东西。只需在当前代码中更新正则表达式
people=re.findall(r'\bUsername:(\S+)\S+域:(\S+)\S+(TECH-\d+),data)
如果输入可以包含文本块,但末尾没有
TECH-\d+
模式,则它将不起作用。@Wiktor它在很多情况下都不起作用,但这不是问题的一部分,也没有样本数据…只获取TECH-1366/67@Milister你能说得更具体些吗?并请提供适当的样本数据。请参阅和。
[[u'TECH-1366'][[u'TECH-1367']]
是我得到的全部,我发布了有问题的示例文件
people = re.findall(r'\bUsername:(\S+)\s+domain:(\S+)\s+First Name:(\S+)\s+Last Name:(\S+)\s+(TECH-\d+)', data)