如何使用正则表达式将字符串拆分为几个部分

时间:2019-08-09 01:44:01

标签: python regex python-3.x

我有一个字符串' DIM D =9999 \ PE TS D(A(4))' 并希望使用正则表达式将该字符串分为几部分。请注意,'DIM' '='是常数,在=之后始终是数字,但是在数字之后,内容可能会发生很大变化。但是'DIM''='之间的空格可能会逐字符串不同。此差异也适用于以下子字符串。另外,我希望将'PE TS'视为一个元素。 因此,我认为该字符串可以具有多个组:'DIM''D''=9999''\''PE TS''D(A(4))'

我尝试过re.match,但是找不到适合它的模式表达式。

match = re.match('(DIM\s+\S)(\d*)(\S+)([\w\s]*)(\s*\w*)', line)

我希望看到:

'DIM', '= 9999', '\', 'PE TS','D(A(4))'

但是,我总是不返回任何内容。

2 个答案:

答案 0 :(得分:2)

也许,这种表达有点类似于

(DIM\s+\S+)\s*(=\s*\d+)\s*(\S+)\s*(.+?)\s{2,}(.+)

可能可以,但是不确定。

测试

import re

regex = r"(DIM\s+\S+)\s*(=\s*\d+)\s*(\S+)\s*(.+?)\s{2,}(.+)"
test_str = """
   DIM D =9999  \ PE TS                         D(A(4))
    DIM AZ =    9999  \   PE TS AC AB                         D(A(4))
"""

print(re.findall(regex, test_str))

输出

[('DIM D', '=9999', '\\', 'PE TS', 'D(A(4))'), ('DIM AZ', '=    9999', '\\', 'PE TS AC AB', 'D(A(4))')]

该表达式在regex101.com的右上角进行了解释,如果您想探索/简化/修改它,在this link中,您可以观察到它如何与某些示例输入匹配,如果愿意的话。

答案 1 :(得分:1)

我确定match不会满足您的期望,因为:

  1. 假设您的正则表达式选择了列表中的所有项目(没有任何东西可以处理\()),match仅选择开头的内容的字符串。
  2. 假设您使用search并具有正确的正则表达式,则search会与DIM D =9999 \ PE TS D(A(4))匹配并且不会拆分。
  3. 假设您确实使用过搜索,正则表达式正确且具有匹配项,则需要在.group()之后使用.groups()re.search(...)来将匹配项作为字符串检索。
  4. 假设您确实有一个可以按需拆分字符串的函数,它将在单独的正则表达式块中(一个用于DIM,一个用于=9999,等等)

这是我分割字符串的方法,尽管艾玛的回答可能更好:

import re

myString = '    DIM D =9999  \ PE TS                         D(A(4))'

# DIM D
dim = re.search('(DIM\s+\S)', myString).group()
equals9999 = re.search('(=\s*\d+)', myString).group()
backslash = re.search(r'\\', myString).group()
twoDoubleLetters = re.search(r'\\(\s+\w+\s+\w+)', myString).group()[2:]
cellMarker = re.search(r'\w\(\w\(\d\)\)', myString).group()

print(dim) # DIM D
print(equals9999) # =9999
print(backslash) # \
print(twoDoubleLetters) # PE TS
print(cellMarker) # D(A(4))