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