检查字符串是否匹配模式

Dan*_*lTA 270 python regex string-matching

如何检查字符串是否与此模式匹配?

大写字母,数字,大写字母,数字......

示例,这些将​​匹配:

A1B2
B10L1
C1N200J1
Run Code Online (Sandbox Code Playgroud)

这些不会('^'指向问题)

a1B2
^
A10B
   ^
AB400
^
Run Code Online (Sandbox Code Playgroud)

Cra*_*sta 408

import re
pattern = re.compile("^([A-Z][0-9]+)+$")
pattern.match(string)
Run Code Online (Sandbox Code Playgroud)

编辑:如评论中所述,match仅检查字符串开头的匹配项,同时re.search()匹配字符串中任何位置的模式.(另见:https://docs.python.org/library/re.html#search-vs-match)

  • @DanielTA您只需要将正则表达式中的星号更改为加号,它将停止匹配空行.星号表示0或更多,因此0(空白)行将匹配.+表示1或更多,因此空白行不匹配. (20认同)
  • 来自`re.match`的文档:`如果字符串开头的零个或多个字符匹配正则表达式模式`.我只花了30分钟试图理解为什么我不能匹配字符串末尾的东西.看起来像`匹配'是不可能的,是吗?为此,`re.search(pattern,my_string)`有效. (14认同)
  • 这匹配一个空行. (7认同)
  • @conradk 是的,你是对的,我认为当你使用 `match` 时,在开头有一个隐含的 `^`。我认为这比那个非常简单的解释要复杂一些,但我不清楚。你是正确的,它确实从字符串的开头开始。 (3认同)
  • @Scooter,呵呵,我没有意识到。谢谢你的提示。值得庆幸的是,这对我的项目来说不是问题,而且如果曾经有一段时间可能会出现问题,我可以添加一个“如果不是字符串”来修复它。 (2认同)

neh*_*iah 141

一内胆: re.match(r"pattern", string) # No need to compile

import re
>>> if re.match(r"hello[0-9]+", 'hello1'):
...     print('Yes')
... 
Yes
Run Code Online (Sandbox Code Playgroud)

您可以bool根据需要评估它

>>> bool(re.match(r"hello[0-9]+", 'hello1'))
True
Run Code Online (Sandbox Code Playgroud)

  • 小心`re.match`.它只匹配字符串的开头.请看看`re.search`. (13认同)
  • @LondonRob 可能是因为 `if` 检查匹配不是 `None`。 (3认同)
  • @nehem 实际上“re”模块中的所有正则表达式函数都会编译并缓存模式。因此,使用编译然后匹配绝对不会比直接调用“re.match”有任何效率提升。所有这些函数都调用内部函数“_compile”(包括“re.compile”),该函数对 python 字典进行缓存。 (3认同)
  • 这很奇怪。为什么可以在“if”上下文中使用“re.match”,但如果在其他地方使用它,则必须使用“bool”? (2认同)
  • @SuhFangmbeng 当在多个地方使用相同的 `re` 来提高效率时,编译很有用。就错误而言,“.match”会抛出与“.compile”相同的错误。使用起来非常安全。 (2认同)

小智 33

请尝试以下方法:

import re

name = ["A1B1", "djdd", "B2C4", "C2H2", "jdoi","1A4V"]

# Match names.
for element in name:
     m = re.match("(^[A-Z]\d[A-Z]\d)", element)
     if m:
        print(m.groups())
Run Code Online (Sandbox Code Playgroud)


Ali*_*jad 24

小心!(也许您想检查完整字符串是否匹配)

\n

如果您想匹配完整的字符串,则该方法re.match(...)将不起作用。

\n

例如;

\n
    \n
  • re.match("[a-z]+", "abcdef")\xe2\x9c\x85 将给出匹配项
  • \n
  • 但!re.match("[a-z]+", "abcdef 12345")\xe2\x9c\x85 也会给出匹配项,因为字符串中有一部分匹配(也许当您检查整个字符串是否有效时您不希望这样)
  • \n
\n

解决方案

\n

使用re.fullmatch(...)。仅当以下情况时才会匹配

\n
if re.fullmatch("[a-z]+", my_string):\n    print("Yes")\n
Run Code Online (Sandbox Code Playgroud)\n
例子
\n
    \n
  • re.fullmatch("[a-z]+", "abcdef")\xe2\x9c\x85 是
  • \n
  • re.fullmatch("[a-z]+", "abcdef 12345")\xe2\x9d\x8c 否
  • \n
\n

一班轮: bool(re.fullmatch("[a-z]+", my_string))

\n


Mar*_*hen 23

import re
import sys

prog = re.compile('([A-Z]\d+)+')

while True:
  line = sys.stdin.readline()
  if not line: break

  if prog.match(line):
    print 'matched'
  else:
    print 'not matched'
Run Code Online (Sandbox Code Playgroud)


cry*_*ick 22

正如评论中所述,所有这些答案都re.match在字符串的开头使用隐式匹配。re.search如果您想泛化到整个字符串,则需要。

import re

pattern = re.compile("([A-Z][0-9]+)+")

# finds match anywhere in string
bool(re.search(pattern, 'aA1A1'))  # True

# matches on start of string, even though pattern does not have ^ constraint
bool(re.match(pattern, 'aA1A1'))  # False
Run Code Online (Sandbox Code Playgroud)

如果您需要完整的字符串来完全匹配正则表达式,请使用以下命令查看@Ali Sajjad 的答案re.fullmatch

图片来源:评论中的@LondonRob 和@conradkleinespel。


Jor*_*ley 7

正则表达式使这很容易......

[A-Z] 将恰好匹配A和Z之间的一个字符

\d+ 将匹配一个或多个数字

() 分组的东西(还有东西......但是现在只想到它们分组)

+ 选择1个或更多


Kne*_*ZOD 6

  
import re

ab = re.compile("^([A-Z]{1}[0-9]{1})+$")
ab.match(string)
  


我相信这应该适用于大写的数字模式.

  • 不需要`{1}`,因为它已经被隐含地假定了. (3认同)