得到一个简单的问题:我有一个这样的文件:
ip-10-0-12-84.eu-west-1.compute.internal, master, instnum=1, Running
.....
.....
ip-10-0-26-118.eu-west-1.compute.internal, master_rabbit, instnum=4, Running
ip-10-0-26-116.eu-west-1.compute.internal, master_rabbit, instnum=5, Running
.....
ip-10-0-26-68.eu-west-1.compute.internal, sql_master, instnum=9, Running
ip-10-0-13-244.eu-west-1.compute.internal, nat, instnum=2, Running
Run Code Online (Sandbox Code Playgroud)
我的目标是读取文件,跳过注释(以...开头#),空/空行以及带有nat或master在其中的行.我试过这个:
open('/tmp/runnings.txt').each do |line|
next if line =~ /(^\s*(#|$)|nat|master)/
Run Code Online (Sandbox Code Playgroud)
这几乎是工作,但它也消除了与线master_rabbit和sql_master在里面.我怎样才能选择master而不是其他任何组合?可以在同一行完成吗?干杯!!
正如标题所说:将字符串从任何情况转换为小写的最佳方法是保持部分不变?例如,一个字符串:FormatDate(%M)==2或者stArTDate(%Y/%m)==11/3我希望将其转换为formatdate(%M)==2或者将其startdate(%Y/%m)==11/3更改为小写,除了大括号之间的部分().对于第一个例子,我提出了这样的事情:
>>> import re
>>> fdt = re.compile('(F|f)(O|o)(R|r)(M|m)(A|a)(T|t)(D|d)(A|a)(T|t)(E|e)\(')
>>> ss = "forMatDate(%M)==2"
>>> if fdt.match(ss):
... SS = ss.split('(')
... SS[0] = SS[0].lower()
... ss = "(".join(SS)
...
>>> print ss
formatdate(%M)==2
Run Code Online (Sandbox Code Playgroud)
虽然它工作得很好,但我并不喜欢这样做.正则表达式是丑陋的,它使得事物几乎限于特定的字符串.有没有更好的(因此,动态的)这样做的方式?提前致谢.干杯!!
我可能没有说得很清楚:它并不总是formatdate(),有时是它startdate()或enddate()与之一起UserName==JohnDee等等...(它是用户输入的一部分)但格式总是相同的,我想要一些可重用的东西.所以,这是基于Krumelur's脚本的更新版本.
>>> fdt = re.compile('\(%[dmwyMW].*\)')
>>> ss = "formatDate(%M)==4"
>>> st = "UserName==JohnDee"
>>>
>>> def dt_lower(sX):
... if fdt.search(sX):
... p1,p2 = sX.split('(',1)
... sX …Run Code Online (Sandbox Code Playgroud) 我有一些文件名如下:
01_dpm_gsi_182.sl5
02_dpm_devel_gsi_182.sl5
03_DPM_DSI_181.sl5
04_globus_httpd_122.sl5
05_globus_httpd_client_cgi_132.sl5
Run Code Online (Sandbox Code Playgroud)
如何重命名这些文件,以便我得到一些类似的东西:
01_dpmgsi_s2011e01.sl5
02_dpmdevelgsi_s2011e02.sl5
....
....
Run Code Online (Sandbox Code Playgroud)
最接近我的建议是这样的:
#!/usr/bin/perl -n
if (/^([^_]+)_(.+)_([^.]+)([.].+)$/) {
my $s = $&;
my $x = $1;
my $y = $2;
my $z = 2011;
my $e = $4;
$y =~ s/_//g;
print "mv $s ${x}_${y}_s${z}e$x$e\n"
}
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
# ls | perl -n reName.pl > output
# bash ./output
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法或单行做这个,可能使用sed/awk?干杯!!
正如标题所说,我正在处理一些命令行选项来创建一个list来自用户的输入,如下所示:"3,28,2".这是我到目前为止所得到的:
>>> rR = "3,28,2"
>>> rR = re.split(r"[\W]+", rR)
>>> map(int, xrange( int(rR[0]),int(rR[1]),int(rR[2]) ))
[3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27]
>>>
Run Code Online (Sandbox Code Playgroud)
仅供参考,这re.split()是因为允许用户在分隔符的同时使用逗号(,)或空格或两者.
我的问题是如何"自动化"该xrange(object)位,以便用户输入可以有或没有开始和步骤值(即" 3,28,2 "对比" 3,28 "对比" 28 ").len(rR)确实告诉我输入中的元素数量,但我有点迷失在这里我如何使用该信息动态编写xrange/range部分.
有任何想法吗)?还试图让我的代码尽可能高效.所以,对此的任何建议将不胜感激.干杯!!
我第一次在Windows(Vista)上尝试了一个处理unicode字符的Python脚本,发现它不起作用.该脚本在Linux和OS X上完全正常,但在Windows上没有任何乐趣.这是我尝试过的小脚本:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, sys, codecs
reload(sys)
sys.setdefaultencoding('utf-8')
print "\nDefault encoding\t: %s" % sys.getdefaultencoding()
print "sys.stdout.encoding\t: %s\n" % sys.stdout.encoding
## Unicode strings
ln1 = u"?0>9<8~7|65\"4:3}2{1+_)(*&^%$£@!/`\\][=-"
ln2 = u"mnbvc xzasdfghjkl;'poiuyàtrewq€é#¢."
refStr = u"%s%s" % (ln2,ln1)
print "refSTR: ", refStr
for x in refStr:
print "%s => %s" % (x, ord(u"%s" % x))
Run Code Online (Sandbox Code Playgroud)
当我从Windows CLI运行脚本时,出现此错误:
C:\Users\san\Scripts>python uniCode.py
Default encoding : utf-8
sys.stdout.encoding : cp850
refSTR; Traceback (most recent call last):
File "uniCode.py", line 18, in <module> …Run Code Online (Sandbox Code Playgroud) 我实际上无法为此提出最合适的标题.但问题是:我有这个小功能,它在屏幕上打印一个倒计时器:
def timer(x):
for i in range(1,x):
sys.stdout.write("\r%d" % i)
sys.stdout.flush()
sleep(1)
sys.stdout.write('\r \r')
Run Code Online (Sandbox Code Playgroud)
如何在打印语句的末尾附加计时器,如:Now counting.... 3?我试过这个:
sys.stdout.write('Now counting..... ')
timer(6)
Run Code Online (Sandbox Code Playgroud)
但是它在行的开头打印定时器,替换前两个字符.任何帮助非常感谢.干杯!!
我有一个文件,其中包含一些类似这样的行:
ENVIRONMENT="myenv"
ENV_DOMAIN='mydomain.net'
LOGIN_KEY=mykey.pem
Run Code Online (Sandbox Code Playgroud)
我想提取后面的部分,=但不带周围的引号。我尝试过gsub这样的:
awk -F= '!/^(#|$)/ && /^ENVIRONMENT=/ {gsub(/"|'/, "", $2); print $2}'
Run Code Online (Sandbox Code Playgroud)
最终会出现-bash: syntax error near unexpected token ')'错误。它适用于单一匹配:/"/或,/'/但当我尝试匹配其中任何一个时,它不起作用。我究竟做错了什么?
我可以像这样快速创建一个 VPC:
import boto3 as boto
inst = boto.Session(profile_name='myprofile').resource('ec2')
def createVpc(nid,az='us-west-2'):
'''Create the VPC'''
vpc = inst.create_vpc(CidrBlock = '10.'+str(nid)+'.0.0/16')
vpc.create_tags(
Tags = [ { 'Key': 'Name', 'Value': 'VPC-'+nid }, ]
)
vpc.wait_until_available()
createVpc('111')
Run Code Online (Sandbox Code Playgroud)
如何使用 CidrBlock:10.111.0.0/16或 Name:VPC-111在创建之前检查 VPC已存在?我实际上想在创建任何 AWS 资源之前进行相同的检查,但 VPC 只是一个开始。最好的事物!
编辑:
发现vpcs.filter可用于查询给定的 VPC 标签;例如:
fltr = [{'Name':'tag:Name', 'Values':['VPC-'+str(nid)]}]
list(inst.vpcs.filter(Filters=fltr))
Run Code Online (Sandbox Code Playgroud)
返回这样一个列表对象:[ec2.Vpc(id='vpc-43e56b3b')]。长度为 0(零)的列表很好地表明 VPC 不存在,但想知道是否有更多 boto/aws 检测方法。
我有两个问题.我正在尝试编写一个接受命令行参数的脚本,我看到我可以使用以下命令启动脚本:
#!/bin/env python
Run Code Online (Sandbox Code Playgroud)
要么
exec python -x "$0" "$@"
Run Code Online (Sandbox Code Playgroud)
这两者有什么区别?
第二个问题是脚本.我有一个像这样的输入数据集:
group_a 5
group_a 7
group_c 6
group_a 8
group_b 8
group_b 4
group_c 7
group_a 8
....
....
Run Code Online (Sandbox Code Playgroud)
如何将所有类似项目组合在一起并总结如下数字:
group_a 28
group_b 12
group_c 13
Run Code Online (Sandbox Code Playgroud) 我正在尝试动态重写文件,如下所示:
10.213.20.173, mem_chld, p3b-aggr-103, c3.xlarge, db, mysql
#10.213.20.191, mem_leaf, p3b-leaf-101, r3.xlarge, db, mysql
10.213.20.192, mem_leaf, p3b-leaf-102, r3.xlarge, db, mysql
10.213.20.190, mem_leaf, p3b-leaf-103, r3.xlarge, db, mysql
.....
Run Code Online (Sandbox Code Playgroud)
从最初的,分离归档到:分离的归档.所以,我用过这个:
awk -F', ' 'BEGIN{OFS=":";} { $1=$1; print }'
Run Code Online (Sandbox Code Playgroud)
这几乎是有效的,但该文件也有一些空白和注释掉的行,我也想排除.我的尝试:
awk -F', ' '!/^(#|$)/ {OFS=":";} { $1=$1; print }'
Run Code Online (Sandbox Code Playgroud)
没有像我预期的那样工作.我怎样才能做到这一点?最好!