如何格式化long`if`语句

时间:2018-01-04 03:05:53

标签: python

我想测试某些字符是否在一行文本中。条件很简单,但要测试的字符很多。

目前我正在使用\进行查看,但感觉很笨拙。什么方法可以使线看起来更好?

text = "Tel+971-2526-821     Fax:+971-2526-821"

if "971" in text or \
   "(84)" in text or \
   "+66" in text or \
   "(452)" in text or \
   "19 " in text:
    print "foreign"

5 个答案:

答案 0 :(得分:3)

为什么不从字符串中提取电话号码并进行测试

text = "Tel:+971-2526-821     Fax:+971-2526-821"

tel, fax = text.split()
tel_prefix, *_ = tel.split(':')[-1].split('-')
fax_prefix, *_ = fax.split(':')[-1].split('-')

if tel_prefix in ("971", "(84)"):
    print("Foreigner")

python 2.x

tel_prefix = tel.split(':')[-1].split('-')[0]
fax_prefix = fax.split(':')[-1].split('-')[0]

答案 1 :(得分:2)

@Patrick Haugh在评论中启发。我们可以这样做:

<form class="form-horizontal" method="post" action="<?php echo base_url().'people/save'?>" onSubmit="return showImage();">

  <div class="box-body">
    <div class="form-group">
      <label for="address" class="col-sm-2 control-label">Address</label>

      <div class="col-sm-10">
        <input type="text" class="form-control" id="address" name="address" readonly />
      </div>                  
    </div>
    <div class="form-group">
      <label for="Telp" class="col-sm-2 control-label">Telp</label>

      <div class="col-sm-10">
        <input type="text" class="form-control" id="Telp" name="Telp" readonly />
      </div>                  
    </div>  

  <div class="modal-footer">
    <button type="button" class="btn btn-default pull-left" data-dismiss="modal">Close</button>
    <button type="submit" class="btn btn-primary">Submit</button>
  </div>

  </form>
  ..

答案 2 :(得分:1)

您可以使用0内置函数来检查文本中是否存在任何一个令牌。如果您想检查字符串中是否存在所有令牌,可以使用any函数替换下面的any。干杯!

all

输出: text = 'Hello your number is 19 ' tokens = ('971', '(84)', '+66', '(452)', '19 ') if any(token in text for token in tokens): print('Foriegn')

答案 3 :(得分:1)

现有的评论提到你不能像你想要的那样拥有多个or语句,但是使用生成器/理解和any()函数你可以提出一个可服务的选项,例如if any(x in text for x in ('971', '(84)', '+66', '(452)', '19 ')):。

我建议使用正则表达式作为解决问题的更通用和有效的方法。您可以动态生成模式,或者出于此问题的目的,以下代码段将起作用(不要忘记转义括号):

import re

text = 'Tel:+971-2526-821     Fax:+971-2526-821'

pattern = u'(971|\(84\)|66|\(452\)|19)'
prog = re.compile(pattern)

if prog.search(text):
    print 'foreign'

如果要为多个可能的子字符串搜索多行文本或大型文本,这种方法将更快,更可重用。您只需编译一次prog,然后就可以随意使用它。

就动态生成模式而言,一个天真的实现可能会做这样的事情:

match_list = ['971', '(84)', '66', '(452)', '19']
pattern = '|'.join(map(lambda s: s.replace('(', '\(').replace(')', '\)'), match_list)).join(['(', ')'])

然后可以根据需要更新和修改变量match_list。运行replace()两次传球效率不高,而且@Andrew Clark有一个很好的技巧来修复here,但我不希望这个答案太长而且麻烦。

答案 4 :(得分:1)

您可以构建一个lambda函数来检查value中是否有text,然后map此函数是values的所有text = "Tel:+971-2526-821 Fax:+971-2526-821" print any(map((lambda x: x in text), ["971", "(84)", "+66", "(452)", "19 "]))

True

结果为values,这意味着text中至少有一个位于{{1}}。