在Python中,对于一个字符串,只接受字母数字字符和下划线。

9

我目前正在为ArcMap 10(updateMessages)中的工具参数编写验证代码,并需要防止用户在字符串中使用非字母数字字符,因为它将用于命名要素类中新创建的字段。

我目前使用了“str.isalnum()”,但这当然排除了下划线。有没有一种有效的方法只接受字母数字字符和下划线?

if self.params[3].altered:
  #Check if field name already exists
  if str(self.params[3].value) in [f.name for f in arcpy.ListFields(str(self.params[0].value))]:
    self.params[3].setErrorMessage("A field with this name already exists in the data set.")
  #Check for invalid characters
  elif not str(self.params[3].value).isalnum():
    self.params[3].setErrorMessage("There are invalid characters in the field name.")   
  else:
    self.params[3].clearMessage()

return
4个回答

11

尝试使用正则表达式:

import re
if re.match(r'^[A-Za-z0-9_]+$', text):
    # do stuff

好的,遗漏了 alpha 部分。 :) - bwind
3
re.match从字符串开头开始匹配,因此^是多余的。 - jamylak
5
我认为在处理正则表达式时具体明确是一个好的实践。这样可以使表达式具有可移植性。 - bwind
那么你应该使用 re.search - jamylak

3
import re
if re.match(r'^\w+$', text):

PEP8 - 一行只有一个语句 -> \n通过 :) - Peter Varo
1
@PeterVaro 如果你喜欢的话 ;) 我使用单行 if 语句来处理非常简单的语句。 - jamylak
谢谢!顺便说一句,这不是关于花哨的东西-> 如果这些StackOverflow上的“示例”和“答案”代码使用“良好的代码格式”,那么我们将向任何刚开始编程或不熟悉Python的人教授这些惯例。实际上,我们的工作将会更加容易:阅读格式良好的代码总是一种享受。 - Peter Varo
@PeterVaro 当然,但也要注意PEP-8就像海盗法典一样,它更像是指南而不是实际规则。我几乎完全遵循它,但有时我会注意到一行if对代码有益的情况。在这种情况下,我认为你提倡使用两行是正确的。 - jamylak
1
@PaulKenjora 错了。\w 当 LOCALE 和 UNICODE 标志未指定时,匹配任何字母数字字符和下划线。https://docs.python.org/2/library/re.html - jamylak
显示剩余2条评论

3
一个不使用正则表达式的替代方法来解决这个特定问题:
if text.replace('_', '').isalnum():
   # do stuff

您还可以检查仅包含ASCII字符的内容:
if text.replace('_', '').isalnum() and text.isascii():
   # do stuff

1

如果您正在使用Python3,并且字符串中有非ASCII字符,则最好使用8位字符串设置编译正则表达式。

import sys
import re

if sys.version_info >= (3, 0):
    _w = re.compile("^\w+$", re.A)
else:
    _w = re.compile("^\w+$")

if re.match(_w, text):
    pass

更多信息请参考此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接