python 的正则表达式
regx for python
我正在编写 regx 以从字符串中删除测试限定符和额外的分隔符。
我有一些模式如下,
"ID"~"Name"~"DESC"
1~2014~13~"DS"~DF"
1~2014~13~"DS"~"DF"
"1ABCA~B C"~"ERTE"
"2"~"XYZ"~"ABC~ is~ bother"
"3"~"YYZ"~"MEL O CRÈME DOUGHNUTS RECLASS"
4~"XAA"~"sf~sd sdfsf"
5~"TES"~"SFSFSF"sdfsf"
6~"ABC"SDDSL~"dfadf"
预期输出是,
ID~Name~DESC
1~2014~13~DS~DF
1~2014~13~DS~DF
1ABCA B C~ERTE
2~XYZ~ABC is bother
3~YYZ~MEL O CRÈME DOUGHNUTS RECLASS
4~XAA~sf sd sdfsf
5~TES~SFSFSF"sdfsf
6~ABCSDDSL~dfadf
我已经写了下面的代码,
import re
delimiter = '~'
pattern = re.compile(r'"' + delimiter + r'"')
pattern1 = re.compile(r'"[^"]*(?:""[^"]*)*"')
with open("source file path here ", "r") as \
test:
for line in test:
fields = re.split(pattern, line)
print(fields)
output = ""
if re.match('^[^"]', line):
matches = re.findall(pattern1, line)
print(matches)
for match in matches:
line = re.sub(match, re.sub('^["]|["]$', "", match), line)
print(line)
else:
lastfield = fields[-1]
for field in fields:
if field != lastfield:
field = re.sub('^["]|["]$', "", field)
output = output + re.sub('[' + delimiter + ']', " ", field) \
+ delimiter
else:
field = re.sub('^["]|["]$', "", field)
output = output + re.sub('[' + delimiter + ']', " ", field)
print(output)
正在寻找执行此操作的优化方法以及将处理所有模式的代码。
我认为您可以删除所有 ~
内部字段限定符
(?m)(?:(?<=^)|(?<=~))"(.*?)"(?=$|~)
详情
(?m)
- re.M
模式开启,使 ^
匹配行首,$
匹配行尾(如果逐行处理字符串,则移除)
(?:(?<=^)|(?<=~))
- 行首或紧接在 ~
之前的位置
"
- 双引号
(.*?)
- 第 1 组:除换行符外的任何 0+ 个字符,尽可能少
"
- 双引号
(?=$|~)
- 行尾或紧跟 ~
的位置。
然后用
删除所有不必要的双引号
(?m)(?:(?<=^)|(?<=~))"|"(?=$|~)|"(?=[^\n"~]+(?:~|$))
详情
(?m)
- re.M
修饰符(如果字符串是逐行处理的去掉)
(?:(?<=^)|(?<=~))"
- 在行首或 ~
之后的双引号
"(?=$|~)|
- 在行尾或 ~
之前的 "
"(?=[^\n"~]+(?:~|$))
- "
后跟除 LF 之外的 1 个或多个字符(如果字符串是逐行处理的,则删除)、"
和 ~
以及然后 ~
或行尾。
Thins one 可用于匹配子字符串,然后使用替换回调方法中的 .replace('~', ' ')
删除所有带空格的 ~
。
参见Python demo:
import re
rx_0 = r"""(?m)(?:(?<=^)|(?<=~))"(.*?)"(?=$|~)"""
rx = r"""(?m)(?:(?<=^)|(?<=~))"|"(?=$|~)|"(?=[^\n"~]+(?:~|$))"""
s = ("\"ID\"~\"Name\"~\"DESC\"\n"
"1~2014~13~\"DS\"~DF\"\n"
"1~2014~13~\"DS\"~\"DF\"\n"
"\"1ABCA~B C\"~\"ERTE\"\n"
"\"2\"~\"XYZ\"~\"ABC~ is~ bother\"\n"
"\"3\"~\"YYZ\"~\"MEL O CRÈME DOUGHNUTS RECLASS\"\n"
"4~\"XAA\"~\"sf~sd sdfsf\"\n"
"5~\"TES\"~\"SFSFSF\"sdfsf\"\n"
"6~\"ABC\"SDDSL~\"dfadf\"")
print( re.sub(rx, "", re.sub(rx_0, lambda x: x.group(1).replace('~', ' '), s)))
输出:
ID~Name~DESC
1~2014~13~DS~DF
1~2014~13~DS~DF
1ABCA B C~ERTE
2~XYZ~ABC is bother
3~YYZ~MEL O CRÈME DOUGHNUTS RECLASS
4~XAA~sf sd sdfsf
5~TES~SFSFSFsdfsf
6~ABC"SDDSL dfadf
我正在编写 regx 以从字符串中删除测试限定符和额外的分隔符。
我有一些模式如下,
"ID"~"Name"~"DESC"
1~2014~13~"DS"~DF"
1~2014~13~"DS"~"DF"
"1ABCA~B C"~"ERTE"
"2"~"XYZ"~"ABC~ is~ bother"
"3"~"YYZ"~"MEL O CRÈME DOUGHNUTS RECLASS"
4~"XAA"~"sf~sd sdfsf"
5~"TES"~"SFSFSF"sdfsf"
6~"ABC"SDDSL~"dfadf"
预期输出是,
ID~Name~DESC
1~2014~13~DS~DF
1~2014~13~DS~DF
1ABCA B C~ERTE
2~XYZ~ABC is bother
3~YYZ~MEL O CRÈME DOUGHNUTS RECLASS
4~XAA~sf sd sdfsf
5~TES~SFSFSF"sdfsf
6~ABCSDDSL~dfadf
我已经写了下面的代码,
import re
delimiter = '~'
pattern = re.compile(r'"' + delimiter + r'"')
pattern1 = re.compile(r'"[^"]*(?:""[^"]*)*"')
with open("source file path here ", "r") as \
test:
for line in test:
fields = re.split(pattern, line)
print(fields)
output = ""
if re.match('^[^"]', line):
matches = re.findall(pattern1, line)
print(matches)
for match in matches:
line = re.sub(match, re.sub('^["]|["]$', "", match), line)
print(line)
else:
lastfield = fields[-1]
for field in fields:
if field != lastfield:
field = re.sub('^["]|["]$', "", field)
output = output + re.sub('[' + delimiter + ']', " ", field) \
+ delimiter
else:
field = re.sub('^["]|["]$', "", field)
output = output + re.sub('[' + delimiter + ']', " ", field)
print(output)
正在寻找执行此操作的优化方法以及将处理所有模式的代码。
我认为您可以删除所有 ~
内部字段限定符
(?m)(?:(?<=^)|(?<=~))"(.*?)"(?=$|~)
详情
(?m)
-re.M
模式开启,使^
匹配行首,$
匹配行尾(如果逐行处理字符串,则移除)(?:(?<=^)|(?<=~))
- 行首或紧接在~
之前的位置
"
- 双引号(.*?)
- 第 1 组:除换行符外的任何 0+ 个字符,尽可能少"
- 双引号(?=$|~)
- 行尾或紧跟~
的位置。
然后用
删除所有不必要的双引号(?m)(?:(?<=^)|(?<=~))"|"(?=$|~)|"(?=[^\n"~]+(?:~|$))
详情
(?m)
-re.M
修饰符(如果字符串是逐行处理的去掉)(?:(?<=^)|(?<=~))"
- 在行首或~
之后的双引号
"(?=$|~)|
- 在行尾或~
之前的 "(?=[^\n"~]+(?:~|$))
-"
后跟除 LF 之外的 1 个或多个字符(如果字符串是逐行处理的,则删除)、"
和~
以及然后~
或行尾。
"
Thins one 可用于匹配子字符串,然后使用替换回调方法中的 .replace('~', ' ')
删除所有带空格的 ~
。
参见Python demo:
import re
rx_0 = r"""(?m)(?:(?<=^)|(?<=~))"(.*?)"(?=$|~)"""
rx = r"""(?m)(?:(?<=^)|(?<=~))"|"(?=$|~)|"(?=[^\n"~]+(?:~|$))"""
s = ("\"ID\"~\"Name\"~\"DESC\"\n"
"1~2014~13~\"DS\"~DF\"\n"
"1~2014~13~\"DS\"~\"DF\"\n"
"\"1ABCA~B C\"~\"ERTE\"\n"
"\"2\"~\"XYZ\"~\"ABC~ is~ bother\"\n"
"\"3\"~\"YYZ\"~\"MEL O CRÈME DOUGHNUTS RECLASS\"\n"
"4~\"XAA\"~\"sf~sd sdfsf\"\n"
"5~\"TES\"~\"SFSFSF\"sdfsf\"\n"
"6~\"ABC\"SDDSL~\"dfadf\"")
print( re.sub(rx, "", re.sub(rx_0, lambda x: x.group(1).replace('~', ' '), s)))
输出:
ID~Name~DESC
1~2014~13~DS~DF
1~2014~13~DS~DF
1ABCA B C~ERTE
2~XYZ~ABC is bother
3~YYZ~MEL O CRÈME DOUGHNUTS RECLASS
4~XAA~sf sd sdfsf
5~TES~SFSFSFsdfsf
6~ABC"SDDSL dfadf