Python 如何格式化长'if'语句

Python 如何格式化长'if'语句,python,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" 为什么不

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

目前我正在使用
\
以便于查看,但感觉很笨拙。怎样才能使台词看起来更漂亮

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"

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

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]

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

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]

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

text = 'Hello your number is 19 '
tokens = ('971', '(84)', '+66', '(452)', '19 ')

if any(token in text for token in tokens):
    print('Foriegn')
输出:
foreign

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

text = 'Hello your number is 19 '
tokens = ('971', '(84)', '+66', '(452)', '19 ')

if any(token in text for token in tokens):
    print('Foriegn')
输出:
foreign

受@Patrick Haugh在评论中的启发。我们可以做到:

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

if any(x in text for x in ("971", "(84)", "+66", "(452)", "19 ")):
    print "foreign"

在评论中受到@Patrick Haugh的启发。我们可以做到:

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

if any(x in text for x in ("971", "(84)", "+66", "(452)", "19 ")):
    print "foreign"

现有的注释提到,您不能像预期的那样拥有多个
语句,但是使用生成器/理解和
any()
函数,您可以找到一个可用的选项,例如snippet
如果有的话(x in text代表x in('971','84','66','452','19')):
这是@Patrick Haugh推荐的

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

如果您正在搜索多行文本或大量文本以查找多个可能的子字符串,这种方法将更快,并且更易于重用。您只需编译
prog
一次,然后就可以随心所欲地使用它

就模式的动态生成而言,天真的实现可能会执行以下操作:

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

然后可以根据需要更新和修改变量
match_list
。运行两次
replace()
,效率有点低,@Andrew Clark有一个很好的技巧来解决这个问题,但我不希望这个答案太长太麻烦。

现有的评论提到,你不可能真的有多个
语句,但是使用生成器/理解和
any()
函数,您可以找到一个可用的选项,例如@Patrick Haugh推荐的
代码段(如果有的话)(x在文本中表示x在('971','(84',',+66','(452','19')):

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

如果您正在搜索多行文本或大量文本以查找多个可能的子字符串,这种方法将更快,并且更易于重用。您只需编译
prog
一次,然后就可以随心所欲地使用它

就模式的动态生成而言,天真的实现可能会执行以下操作:

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

然后可以根据需要更新和修改变量
match_list
。运行两次
replace()
时效率有点低,@Andrew Clark有一个很好的技巧来解决这个问题,但我不希望这个答案太长太麻烦。

您可以构造一个
lambda
函数,检查
文本中是否有
值,然后
将该函数映射到所有

text = "Tel:+971-2526-821     Fax:+971-2526-821"
print any(map((lambda x: x in text), ["971", "(84)", "+66", "(452)", "19 "]))

结果是
True
,这意味着
值中至少有一个
text
中您可以构造一个
lambda
函数来检查
值是否在
文本中,然后
将该函数映射到所有
值中

text = "Tel:+971-2526-821     Fax:+971-2526-821"
print any(map((lambda x: x in text), ["971", "(84)", "+66", "(452)", "19 "]))

结果是
True
,这意味着
值中至少有一个
text

@GarbageCollector中:次要注意:
str
文本的
tuple
更有效;字节码编译器可以将整个
元组作为常量存储并重用它,而
列表每次都需要重建。@GarbageCollector,Patrick Haugh,ShadowRanger,marvelous!有谁能给我一个答案,这样我就可以结束这个问题了?@ShadowRanger同意使用
tuple
而不是
list
@GarbageCollector:Minor note:A
tuple
str
文本将更有效率;字节码编译器可以将整个
元组作为常量存储并重用它,而
列表每次都需要重建。@GarbageCollector,Patrick Haugh,ShadowRanger,marvelous!你能给出一个答案让我结束这个问题吗?@ShadowRanger同意使用
tuple
而不是
list
Check@ShadowRanger上面的评论肯定是一个优势。@GarbageCollector:谢谢你指点我。已将其修改为tuple。你好@斯瓦迪卡尔C,谢谢你的帮助。希望你不介意我选择投票最多的答案。没问题。谢谢你的尽职调查:)查看上面@ShadowRanger的评论。@GarbageCollector:谢谢你指点我。已将其修改为tuple。你好@斯瓦迪卡尔C,谢谢你的帮助。希望你不介意我选择投票最多的答案。没问题。感谢您的尽职调查:)@taoufik A,感谢您的密切跟踪,以及